gpu: fix r32p1 build error on user version [3/14]

PD#SWPL-56978

Problem:
mali driver is not official for AndroidS

Solution:
update to r32p1 beta

Verify:
full verification tests on ohm

Change-Id: Ie689970b5a2e6aef6f03adbcc210e4f3d61c23fa
Signed-off-by: binqi zhang <binqi.zhang@amlogic.com>
diff --git a/0001-update-r32p1-gpu-driver.patch b/0001-update-r32p1-gpu-driver.patch
deleted file mode 100644
index ca10415..0000000
--- a/0001-update-r32p1-gpu-driver.patch
+++ /dev/null
@@ -1,94611 +0,0 @@
-From 39f791b03c5e534884f13ecfb9f86306fe7324dd Mon Sep 17 00:00:00 2001
-From: binqi zhang <binqi.zhang@amlogic.com>
-Date: Thu, 12 Aug 2021 16:34:29 +0800
-Subject: [PATCH] update r32p1 gpu driver
-
-Change-Id: Ic8672b57c42e98ed97c65b48925280fbb38de0ee
----
- .../ABI/testing/sysfs-device-mali             |  293 +
- .../devicetree/bindings/arm/mali-midgard.txt  |   19 +-
- .../bindings/arm/memory_group_manager.txt     |    7 +-
- .../bindings/arm/priority_control_manager.txt |   48 +
- .../arm/protected_memory_allocator.txt        |    7 +-
- .../devicetree/bindings/power/mali-opp.txt    |    9 +-
- .../Documentation/dma-buf-test-exporter.txt   |   10 +-
- dvalin/kernel/Mconfig                         |   31 +-
- dvalin/kernel/build.bp                        |   65 +-
- dvalin/kernel/drivers/base/arm/Kbuild         |   34 +
- dvalin/kernel/drivers/base/arm/Kconfig        |   64 +
- dvalin/kernel/drivers/base/arm/Makefile       |   98 +
- dvalin/kernel/drivers/base/arm/Mconfig        |   64 +
- .../base/{ => arm}/dma_buf_lock/src/Kbuild    |    9 +-
- .../base/{ => arm}/dma_buf_lock/src/Makefile  |   17 +-
- .../{ => arm}/dma_buf_lock/src/dma_buf_lock.c |  132 +-
- .../{ => arm}/dma_buf_lock/src/dma_buf_lock.h |    7 +-
- .../base/arm/dma_buf_test_exporter/Kbuild     |   23 +
- .../base/arm/dma_buf_test_exporter/build.bp   |   36 +
- .../dma-buf-test-exporter.c                   |  106 +-
- .../memory_group_manager}/Kbuild              |   11 +-
- .../base/arm/memory_group_manager/build.bp    |   36 +
- .../memory_group_manager.c                    |   14 +-
- .../arm/protected_memory_allocator/Kbuild     |   23 +
- .../arm/protected_memory_allocator/build.bp   |   36 +
- .../protected_memory_allocator.c              |  551 ++
- .../base/dma_buf_test_exporter/Kconfig        |   26 -
- .../base/dma_buf_test_exporter/Makefile       |   36 -
- .../base/dma_buf_test_exporter/build.bp       |   26 -
- .../base/memory_group_manager/Makefile        |   35 -
- .../base/memory_group_manager/build.bp        |   22 -
- .../base/protected_memory_allocator/Makefile  |   35 -
- .../base/protected_memory_allocator/build.bp  |   26 -
- .../protected_memory_allocator.c              |  308 -
- dvalin/kernel/drivers/gpu/arm/Kbuild          |    8 +-
- dvalin/kernel/drivers/gpu/arm/Kconfig         |    8 +-
- .../Kbuild => gpu/arm/Makefile}               |    9 +-
- dvalin/kernel/drivers/gpu/arm/midgard/Kbuild  |  367 +-
- dvalin/kernel/drivers/gpu/arm/midgard/Kconfig |  357 +-
- .../kernel/drivers/gpu/arm/midgard/Makefile   |  201 +-
- dvalin/kernel/drivers/gpu/arm/midgard/Mconfig |  288 +-
- .../drivers/gpu/arm/midgard/arbiter/Kbuild    |   11 +-
- .../arm/midgard/arbiter/mali_kbase_arbif.c    |  209 +-
- .../arm/midgard/arbiter/mali_kbase_arbif.h    |   44 +-
- .../midgard/arbiter/mali_kbase_arbiter_defs.h |   34 +-
- .../arbiter/mali_kbase_arbiter_interface.h    |   70 +-
- .../midgard/arbiter/mali_kbase_arbiter_pm.c   |  614 +-
- .../midgard/arbiter/mali_kbase_arbiter_pm.h   |   87 +-
- .../gpu/arm/midgard/backend/gpu/Kbuild        |   70 +-
- .../backend/gpu/mali_kbase_backend_config.h   |    7 +-
- .../gpu/mali_kbase_cache_policy_backend.c     |    9 +-
- .../gpu/mali_kbase_cache_policy_backend.h     |   10 +-
- .../gpu/mali_kbase_clk_rate_trace_mgr.c       |  325 ++
- .../gpu/mali_kbase_clk_rate_trace_mgr.h       |  154 +
- .../gpu/mali_kbase_debug_job_fault_backend.c  |   11 +-
- .../midgard/backend/gpu/mali_kbase_devfreq.c  |  207 +-
- .../midgard/backend/gpu/mali_kbase_devfreq.h  |   23 +-
- .../backend/gpu/mali_kbase_device_hw.c        |  388 --
- .../backend/gpu/mali_kbase_device_internal.h  |  127 -
- .../backend/gpu/mali_kbase_gpuprops_backend.c |   75 +-
- .../backend/gpu/mali_kbase_instr_backend.c    |  130 +-
- .../backend/gpu/mali_kbase_instr_defs.h       |   18 +-
- .../backend/gpu/mali_kbase_instr_internal.h   |    9 +-
- .../backend/gpu/mali_kbase_irq_internal.h     |    7 +-
- .../backend/gpu/mali_kbase_irq_linux.c        |   37 +-
- .../midgard/backend/gpu/mali_kbase_jm_as.c    |   14 +-
- .../midgard/backend/gpu/mali_kbase_jm_defs.h  |   20 +-
- .../midgard/backend/gpu/mali_kbase_jm_hw.c    |  236 +-
- .../backend/gpu/mali_kbase_jm_internal.h      |   17 +-
- .../midgard/backend/gpu/mali_kbase_jm_rb.c    |  145 +-
- .../midgard/backend/gpu/mali_kbase_jm_rb.h    |    8 +-
- .../backend/gpu/mali_kbase_js_backend.c       |   61 +-
- .../backend/gpu/mali_kbase_js_internal.h      |    8 +-
- .../backend/gpu/mali_kbase_l2_mmu_config.c    |   47 +-
- .../backend/gpu/mali_kbase_l2_mmu_config.h    |   25 +-
- .../backend/gpu/mali_kbase_pm_always_on.c     |   13 +-
- .../backend/gpu/mali_kbase_pm_always_on.h     |    9 +-
- .../backend/gpu/mali_kbase_pm_backend.c       |  243 +-
- .../midgard/backend/gpu/mali_kbase_pm_ca.c    |   44 +-
- .../midgard/backend/gpu/mali_kbase_pm_ca.h    |    7 +-
- .../backend/gpu/mali_kbase_pm_ca_devfreq.h    |    7 +-
- .../backend/gpu/mali_kbase_pm_coarse_demand.c |   13 +-
- .../backend/gpu/mali_kbase_pm_coarse_demand.h |    9 +-
- .../midgard/backend/gpu/mali_kbase_pm_defs.h  |  244 +-
- .../backend/gpu/mali_kbase_pm_driver.c        |  907 ++-
- .../backend/gpu/mali_kbase_pm_internal.h      |  143 +-
- .../backend/gpu/mali_kbase_pm_l2_states.h     |   20 +-
- .../backend/gpu/mali_kbase_pm_mcu_states.h    |   63 +
- .../backend/gpu/mali_kbase_pm_metrics.c       |  271 +-
- .../backend/gpu/mali_kbase_pm_policy.c        |  204 +-
- .../backend/gpu/mali_kbase_pm_policy.h        |    7 +-
- .../backend/gpu/mali_kbase_pm_shader_states.h |   44 +-
- .../arm/midgard/backend/gpu/mali_kbase_time.c |   57 +-
- .../kernel/drivers/gpu/arm/midgard/build.bp   |  203 +-
- .../arm/midgard/context/Kbuild}               |   19 +-
- .../context/backend/mali_kbase_context_csf.c  |  201 +
- .../context/backend/mali_kbase_context_jm.c   |  138 +-
- .../arm/midgard/context/mali_kbase_context.c  |  205 +-
- .../arm/midgard/context/mali_kbase_context.h  |   35 +-
- .../context/mali_kbase_context_internal.h     |   18 +-
- .../kernel/drivers/gpu/arm/midgard/csf/Kbuild |   47 +
- .../ipa_control/Kbuild}                       |   11 +-
- .../ipa_control/mali_kbase_csf_ipa_control.c  |  925 +++
- .../ipa_control/mali_kbase_csf_ipa_control.h  |  244 +
- .../gpu/arm/midgard/csf/mali_kbase_csf.c      | 3069 ++++++++++
- .../gpu/arm/midgard/csf/mali_kbase_csf.h      |  564 ++
- .../csf/mali_kbase_csf_cpu_queue_debugfs.c    |  191 +
- .../csf/mali_kbase_csf_cpu_queue_debugfs.h    |   90 +
- .../midgard/csf/mali_kbase_csf_csg_debugfs.c  |  591 ++
- .../midgard/csf/mali_kbase_csf_csg_debugfs.h  |   47 +
- .../gpu/arm/midgard/csf/mali_kbase_csf_defs.h | 1254 ++++
- .../arm/midgard/csf/mali_kbase_csf_firmware.c | 2337 ++++++++
- .../arm/midgard/csf/mali_kbase_csf_firmware.h |  811 +++
- .../midgard/csf/mali_kbase_csf_firmware_cfg.c |  327 ++
- .../midgard/csf/mali_kbase_csf_firmware_cfg.h |   74 +
- .../csf/mali_kbase_csf_firmware_no_mali.c     | 1389 +++++
- .../csf/mali_kbase_csf_heap_context_alloc.c   |  195 +
- .../csf/mali_kbase_csf_heap_context_alloc.h   |   75 +
- .../gpu/arm/midgard/csf/mali_kbase_csf_kcpu.c | 2258 ++++++++
- .../gpu/arm/midgard/csf/mali_kbase_csf_kcpu.h |  356 ++
- .../midgard/csf/mali_kbase_csf_kcpu_debugfs.c |  197 +
- .../midgard/csf/mali_kbase_csf_kcpu_debugfs.h |   37 +
- .../csf/mali_kbase_csf_protected_memory.c     |  119 +
- .../csf/mali_kbase_csf_protected_memory.h     |   71 +
- .../midgard/csf/mali_kbase_csf_reset_gpu.c    |  629 ++
- .../midgard/csf/mali_kbase_csf_scheduler.c    | 5063 +++++++++++++++++
- .../midgard/csf/mali_kbase_csf_scheduler.h    |  494 ++
- .../midgard/csf/mali_kbase_csf_tiler_heap.c   |  611 ++
- .../midgard/csf/mali_kbase_csf_tiler_heap.h   |  115 +
- .../csf/mali_kbase_csf_tiler_heap_debugfs.c   |  106 +
- .../csf/mali_kbase_csf_tiler_heap_debugfs.h   |   37 +
- .../csf/mali_kbase_csf_tiler_heap_def.h       |  114 +
- .../arm/midgard/csf/mali_kbase_csf_timeout.c  |  178 +
- .../arm/midgard/csf/mali_kbase_csf_timeout.h  |   66 +
- .../midgard/csf/mali_kbase_csf_tl_reader.c    |  534 ++
- .../midgard/csf/mali_kbase_csf_tl_reader.h    |  185 +
- .../midgard/csf/mali_kbase_csf_trace_buffer.c |  688 +++
- .../midgard/csf/mali_kbase_csf_trace_buffer.h |  182 +
- .../drivers/gpu/arm/midgard/debug/Kbuild      |   27 +
- .../mali_kbase_debug_ktrace_codes_csf.h       |  278 +
- .../mali_kbase_debug_ktrace_codes_jm.h        |   10 +-
- .../backend/mali_kbase_debug_ktrace_csf.c     |  193 +
- .../backend/mali_kbase_debug_ktrace_csf.h     |  203 +
- .../mali_kbase_debug_ktrace_defs_csf.h        |  116 +
- .../backend/mali_kbase_debug_ktrace_defs_jm.h |  100 +-
- .../backend/mali_kbase_debug_ktrace_jm.c      |   50 +-
- .../backend/mali_kbase_debug_ktrace_jm.h      |  118 +-
- .../mali_kbase_debug_linux_ktrace_csf.h       |  241 +
- .../mali_kbase_debug_linux_ktrace_jm.h        |   52 +-
- .../midgard/debug/mali_kbase_debug_ktrace.c   |   55 +-
- .../midgard/debug/mali_kbase_debug_ktrace.h   |   20 +-
- .../debug/mali_kbase_debug_ktrace_codes.h     |   24 +-
- .../debug/mali_kbase_debug_ktrace_defs.h      |   83 +-
- .../debug/mali_kbase_debug_ktrace_internal.h  |    7 +-
- .../debug/mali_kbase_debug_linux_ktrace.h     |   40 +-
- .../{tests/kutf/Makefile => device/Kbuild}    |   30 +-
- .../device/backend/mali_kbase_device_csf.c    |  464 ++
- .../device/backend/mali_kbase_device_hw_csf.c |  163 +
- .../device/backend/mali_kbase_device_hw_jm.c  |   98 +
- .../device/backend/mali_kbase_device_jm.c     |  181 +-
- .../arm/midgard/device/mali_kbase_device.c    |  233 +-
- .../arm/midgard/device/mali_kbase_device.h    |  126 +-
- .../arm/midgard/device/mali_kbase_device_hw.c |  182 +
- .../device/mali_kbase_device_internal.h       |   24 +-
- .../{tests/kutf/Kconfig => gpu/Kbuild}        |   19 +-
- .../gpu/backend/mali_kbase_gpu_fault_csf.c    |  104 +
- .../gpu/backend/mali_kbase_gpu_fault_jm.c     |   13 +-
- .../gpu/arm/midgard/gpu/mali_kbase_gpu.c      |    8 +-
- .../arm/midgard/gpu/mali_kbase_gpu_fault.h    |   23 +-
- .../arm/midgard/gpu/mali_kbase_gpu_regmap.h   |  416 +-
- .../kernel/drivers/gpu/arm/midgard/ipa/Kbuild |   25 +-
- .../mali_kbase_ipa_counter_common_csf.c       |  457 ++
- .../mali_kbase_ipa_counter_common_csf.h       |  159 +
- .../mali_kbase_ipa_counter_common_jm.c}       |   20 +-
- .../mali_kbase_ipa_counter_common_jm.h}       |   40 +-
- .../ipa/backend/mali_kbase_ipa_counter_csf.c  |  171 +
- .../mali_kbase_ipa_counter_jm.c}              |  113 +-
- .../gpu/arm/midgard/ipa/mali_kbase_ipa.c      |  287 +-
- .../gpu/arm/midgard/ipa/mali_kbase_ipa.h      |   90 +-
- .../arm/midgard/ipa/mali_kbase_ipa_debugfs.c  |   12 +-
- .../arm/midgard/ipa/mali_kbase_ipa_debugfs.h  |   12 +-
- .../arm/midgard/ipa/mali_kbase_ipa_simple.c   |   53 +-
- .../arm/midgard/ipa/mali_kbase_ipa_simple.h   |    7 +-
- .../gpu/arm/midgard/jm/mali_kbase_jm_defs.h   |   76 +-
- .../gpu/arm/midgard/jm/mali_kbase_jm_js.h     |   89 +-
- .../gpu/arm/midgard/jm/mali_kbase_js_defs.h   |  411 +-
- .../arm/midgard/mali_base_hwconfig_features.h |   62 +-
- .../arm/midgard/mali_base_hwconfig_issues.h   |   62 +-
- .../drivers/gpu/arm/midgard/mali_kbase.h      |  165 +-
- .../arm/midgard/mali_kbase_as_fault_debugfs.c |   11 +-
- .../arm/midgard/mali_kbase_as_fault_debugfs.h |    9 +-
- .../drivers/gpu/arm/midgard/mali_kbase_bits.h |   16 +-
- .../gpu/arm/midgard/mali_kbase_cache_policy.c |   12 +-
- .../gpu/arm/midgard/mali_kbase_cache_policy.h |   11 +-
- .../drivers/gpu/arm/midgard/mali_kbase_caps.h |   61 +
- .../gpu/arm/midgard/mali_kbase_ccswe.c        |  100 +
- .../gpu/arm/midgard/mali_kbase_ccswe.h        |   96 +
- .../gpu/arm/midgard/mali_kbase_config.c       |   68 +-
- .../gpu/arm/midgard/mali_kbase_config.h       |  294 +-
- .../arm/midgard/mali_kbase_config_defaults.h  |   26 +-
- .../gpu/arm/midgard/mali_kbase_core_linux.c   | 1969 +++++--
- .../arm/midgard/mali_kbase_cs_experimental.h  |   20 +-
- .../gpu/arm/midgard/mali_kbase_ctx_sched.c    |   84 +-
- .../gpu/arm/midgard/mali_kbase_ctx_sched.h    |   44 +-
- .../gpu/arm/midgard/mali_kbase_debug.c        |    9 +-
- .../gpu/arm/midgard/mali_kbase_debug.h        |   79 +-
- .../arm/midgard/mali_kbase_debug_job_fault.c  |   36 +-
- .../arm/midgard/mali_kbase_debug_job_fault.h  |   10 +-
- .../arm/midgard/mali_kbase_debug_mem_view.c   |   26 +-
- .../arm/midgard/mali_kbase_debug_mem_view.h   |    7 +-
- .../arm/midgard/mali_kbase_debugfs_helper.c   |  104 +-
- .../arm/midgard/mali_kbase_debugfs_helper.h   |   53 +-
- .../drivers/gpu/arm/midgard/mali_kbase_defs.h |  573 +-
- .../arm/midgard/mali_kbase_disjoint_events.c  |    7 +-
- .../gpu/arm/midgard/mali_kbase_dma_fence.c    |   59 +-
- .../gpu/arm/midgard/mali_kbase_dma_fence.h    |   26 +-
- .../gpu/arm/midgard/mali_kbase_dummy_job_wa.c |   15 +-
- .../gpu/arm/midgard/mali_kbase_dummy_job_wa.h |   36 +-
- .../gpu/arm/midgard/mali_kbase_dvfs_debugfs.c |   98 +
- .../gpu/arm/midgard/mali_kbase_dvfs_debugfs.h |   35 +
- .../gpu/arm/midgard/mali_kbase_event.c        |   30 +-
- .../gpu/arm/midgard/mali_kbase_fence.c        |   73 +-
- .../gpu/arm/midgard/mali_kbase_fence.h        |   17 +-
- .../gpu/arm/midgard/mali_kbase_fence_defs.h   |   15 +-
- .../gpu/arm/midgard/mali_kbase_fence_ops.c    |   83 +
- .../gpu/arm/midgard/mali_kbase_gator.h        |    7 +-
- .../midgard/mali_kbase_gpu_memory_debugfs.c   |   22 +-
- .../midgard/mali_kbase_gpu_memory_debugfs.h   |   26 +-
- .../gpu/arm/midgard/mali_kbase_gpuprops.c     |  315 +-
- .../gpu/arm/midgard/mali_kbase_gpuprops.h     |   67 +-
- .../arm/midgard/mali_kbase_gpuprops_types.h   |   89 +-
- .../drivers/gpu/arm/midgard/mali_kbase_gwt.c  |   11 +-
- .../drivers/gpu/arm/midgard/mali_kbase_gwt.h  |    9 +-
- .../drivers/gpu/arm/midgard/mali_kbase_hw.c   |  230 +-
- .../drivers/gpu/arm/midgard/mali_kbase_hw.h   |   23 +-
- .../arm/midgard/mali_kbase_hwaccess_backend.h |    8 +-
- .../arm/midgard/mali_kbase_hwaccess_defs.h    |   15 +-
- .../midgard/mali_kbase_hwaccess_gpuprops.h    |   39 +-
- .../arm/midgard/mali_kbase_hwaccess_instr.h   |   22 +-
- .../gpu/arm/midgard/mali_kbase_hwaccess_jm.h  |   12 +-
- .../gpu/arm/midgard/mali_kbase_hwaccess_pm.h  |   75 +-
- .../arm/midgard/mali_kbase_hwaccess_time.h    |   30 +-
- .../gpu/arm/midgard/mali_kbase_hwcnt.c        |  103 +-
- .../midgard/mali_kbase_hwcnt_accumulator.h    |    7 +-
- .../arm/midgard/mali_kbase_hwcnt_backend.h    |  102 +-
- .../midgard/mali_kbase_hwcnt_backend_csf.c    | 1864 ++++++
- .../midgard/mali_kbase_hwcnt_backend_csf.h    |  162 +
- .../midgard/mali_kbase_hwcnt_backend_csf_if.h |  311 +
- .../mali_kbase_hwcnt_backend_csf_if_fw.c      |  787 +++
- .../mali_kbase_hwcnt_backend_csf_if_fw.h      |   50 +
- .../midgard/mali_kbase_hwcnt_backend_gpu.c    |  510 --
- .../arm/midgard/mali_kbase_hwcnt_backend_jm.c |  793 +++
- ...nd_gpu.h => mali_kbase_hwcnt_backend_jm.h} |   23 +-
- .../arm/midgard/mali_kbase_hwcnt_context.h    |   46 +-
- .../gpu/arm/midgard/mali_kbase_hwcnt_gpu.c    |  760 +--
- .../gpu/arm/midgard/mali_kbase_hwcnt_gpu.h    |  314 +-
- .../gpu/arm/midgard/mali_kbase_hwcnt_legacy.c |   11 +-
- .../gpu/arm/midgard/mali_kbase_hwcnt_legacy.h |    7 +-
- .../gpu/arm/midgard/mali_kbase_hwcnt_types.c  |  129 +-
- .../gpu/arm/midgard/mali_kbase_hwcnt_types.h  |  125 +-
- .../midgard/mali_kbase_hwcnt_virtualizer.c    |   26 +-
- .../midgard/mali_kbase_hwcnt_virtualizer.h    |   23 +-
- .../drivers/gpu/arm/midgard/mali_kbase_jd.c   |  331 +-
- .../gpu/arm/midgard/mali_kbase_jd_debugfs.c   |   56 +-
- .../gpu/arm/midgard/mali_kbase_jd_debugfs.h   |   12 +-
- .../drivers/gpu/arm/midgard/mali_kbase_jm.c   |   16 +-
- .../drivers/gpu/arm/midgard/mali_kbase_jm.h   |   12 +-
- .../drivers/gpu/arm/midgard/mali_kbase_js.c   |  422 +-
- .../drivers/gpu/arm/midgard/mali_kbase_js.h   |   12 +-
- .../gpu/arm/midgard/mali_kbase_js_ctx_attr.c  |   39 +-
- .../gpu/arm/midgard/mali_kbase_js_ctx_attr.h  |   47 +-
- .../gpu/arm/midgard/mali_kbase_kinstr_jm.c    |  894 +++
- .../gpu/arm/midgard/mali_kbase_kinstr_jm.h    |  275 +
- .../gpu/arm/midgard/mali_kbase_linux.h        |   12 +-
- .../drivers/gpu/arm/midgard/mali_kbase_mem.c  | 1160 ++--
- .../drivers/gpu/arm/midgard/mali_kbase_mem.h  |  518 +-
- .../gpu/arm/midgard/mali_kbase_mem_linux.c    |  683 ++-
- .../gpu/arm/midgard/mali_kbase_mem_linux.h    |   36 +-
- .../gpu/arm/midgard/mali_kbase_mem_lowlevel.h |   13 +-
- .../gpu/arm/midgard/mali_kbase_mem_pool.c     |   44 +-
- .../arm/midgard/mali_kbase_mem_pool_debugfs.c |    7 +-
- .../arm/midgard/mali_kbase_mem_pool_debugfs.h |    7 +-
- .../arm/midgard/mali_kbase_mem_pool_group.c   |    7 +-
- .../arm/midgard/mali_kbase_mem_pool_group.h   |    7 +-
- .../midgard/mali_kbase_mem_profile_debugfs.c  |   26 +-
- .../midgard/mali_kbase_mem_profile_debugfs.h  |   23 +-
- .../mali_kbase_mem_profile_debugfs_buf_size.h |    8 +-
- .../arm/midgard/mali_kbase_mipe_gen_header.h  |   40 +-
- .../gpu/arm/midgard/mali_kbase_mipe_proto.h   |    7 +-
- .../gpu/arm/midgard/mali_kbase_native_mgm.c   |    7 +-
- .../gpu/arm/midgard/mali_kbase_native_mgm.h   |    9 +-
- .../arm/midgard/mali_kbase_platform_fake.c    |   15 +-
- .../drivers/gpu/arm/midgard/mali_kbase_pm.c   |   55 +-
- .../drivers/gpu/arm/midgard/mali_kbase_pm.h   |   34 +-
- .../midgard/mali_kbase_regs_history_debugfs.c |  138 +-
- .../midgard/mali_kbase_regs_history_debugfs.h |   40 +-
- .../gpu/arm/midgard/mali_kbase_reset_gpu.h    |  162 +-
- .../drivers/gpu/arm/midgard/mali_kbase_smc.c  |    9 +-
- .../drivers/gpu/arm/midgard/mali_kbase_smc.h  |   11 +-
- .../gpu/arm/midgard/mali_kbase_softjobs.c     |  167 +-
- .../gpu/arm/midgard/mali_kbase_strings.c      |   10 +-
- .../gpu/arm/midgard/mali_kbase_strings.h      |    7 +-
- .../drivers/gpu/arm/midgard/mali_kbase_sync.h |   28 +-
- .../gpu/arm/midgard/mali_kbase_sync_android.c |   67 +-
- .../gpu/arm/midgard/mali_kbase_sync_common.c  |   11 +-
- .../gpu/arm/midgard/mali_kbase_sync_file.c    |   36 +-
- .../arm/midgard/mali_kbase_trace_gpu_mem.c    |  221 +
- .../arm/midgard/mali_kbase_trace_gpu_mem.h    |  100 +
- .../gpu/arm/midgard/mali_kbase_utility.h      |   11 +-
- .../gpu/arm/midgard/mali_kbase_vinstr.c       |  311 +-
- .../gpu/arm/midgard/mali_kbase_vinstr.h       |    7 +-
- .../gpu/arm/midgard/mali_linux_trace.h        |   47 +-
- .../drivers/gpu/arm/midgard/mali_malisw.h     |   60 +-
- ...gpu.h => mali_power_gpu_frequency_trace.c} |   21 +-
- .../midgard/mali_power_gpu_frequency_trace.h  |   68 +
- .../Kconfig => gpu/arm/midgard/mmu/Kbuild}    |   22 +-
- .../midgard/mmu/backend/mali_kbase_mmu_csf.c  |  565 ++
- .../midgard/mmu/backend/mali_kbase_mmu_jm.c   |   90 +-
- .../gpu/arm/midgard/mmu/mali_kbase_mmu.c      |  220 +-
- .../gpu/arm/midgard/mmu/mali_kbase_mmu.h      |   45 +-
- .../gpu/arm/midgard/mmu/mali_kbase_mmu_hw.h   |   12 +-
- .../midgard/mmu/mali_kbase_mmu_hw_direct.c    |   67 +-
- .../arm/midgard/mmu/mali_kbase_mmu_internal.h |   49 +-
- .../midgard/mmu/mali_kbase_mmu_mode_aarch64.c |   25 +-
- .../midgard/mmu/mali_kbase_mmu_mode_lpae.c    |  215 -
- .../drivers/gpu/arm/midgard/platform/Kconfig  |   10 +-
- .../arm/midgard/platform/devicetree/Kbuild    |    7 +-
- .../midgard/platform/devicetree/Kbuild.rej    |   17 +
- .../devicetree/mali_kbase_clk_rate_trace.c    |  105 +
- .../devicetree/mali_kbase_config_devicetree.c |   39 +-
- .../devicetree/mali_kbase_config_platform.c   |   43 +
- .../devicetree/mali_kbase_config_platform.h   |   54 +-
- .../mali_kbase_config_platform.h.rej          |   42 +
- .../devicetree/mali_kbase_runtime_pm.c        |   26 +-
- .../gpu/arm/midgard/platform/vexpress/Kbuild  |   11 +-
- .../vexpress/mali_kbase_config_platform.h     |    7 +-
- .../vexpress/mali_kbase_config_vexpress.c     |   22 +-
- .../midgard/platform/vexpress_1xv7_a57/Kbuild |   11 +-
- .../mali_kbase_config_platform.h              |    7 +-
- .../mali_kbase_config_vexpress.c              |   20 +-
- .../platform/vexpress_6xvirtex7_10mhz/Kbuild  |   13 +-
- .../mali_kbase_config_platform.h              |    7 +-
- .../mali_kbase_config_vexpress.c              |   22 +-
- .../gpu/arm/midgard/protected_mode_switcher.h |   31 +-
- .../drivers/gpu/arm/midgard/tests/Kbuild      |   17 +-
- .../drivers/gpu/arm/midgard/tests/Kconfig     |   46 +-
- .../drivers/gpu/arm/midgard/tests/Mconfig     |   81 +-
- .../drivers/gpu/arm/midgard/tests/build.bp    |   40 +
- .../midgard/tests/include/kutf/kutf_helpers.h |   15 +-
- .../tests/include/kutf/kutf_helpers_user.h    |   25 +-
- .../arm/midgard/tests/include/kutf/kutf_mem.h |    7 +-
- .../tests/include/kutf/kutf_resultset.h       |    7 +-
- .../midgard/tests/include/kutf/kutf_suite.h   |   29 +-
- .../midgard/tests/include/kutf/kutf_utils.h   |    7 +-
- .../drivers/gpu/arm/midgard/tests/kutf/Kbuild |   21 +-
- .../gpu/arm/midgard/tests/kutf/build.bp       |   24 +-
- .../gpu/arm/midgard/tests/kutf/kutf_helpers.c |   13 +-
- .../midgard/tests/kutf/kutf_helpers_user.c    |   28 +-
- .../gpu/arm/midgard/tests/kutf/kutf_mem.c     |    7 +-
- .../arm/midgard/tests/kutf/kutf_resultset.c   |    7 +-
- .../gpu/arm/midgard/tests/kutf/kutf_suite.c   |   23 +-
- .../gpu/arm/midgard/tests/kutf/kutf_utils.c   |    7 +-
- .../mali_kutf_clk_rate_trace/kernel/Kbuild    |   25 +
- .../mali_kutf_clk_rate_trace/kernel/build.bp  |   43 +
- .../kernel/mali_kutf_clk_rate_trace_test.c    |  957 ++++
- .../mali_kutf_clk_rate_trace_test.h           |  151 +
- .../midgard/tests/mali_kutf_irq_test/Kbuild   |   13 +-
- .../midgard/tests/mali_kutf_irq_test/Kconfig  |   29 -
- .../midgard/tests/mali_kutf_irq_test/Makefile |   51 -
- .../midgard/tests/mali_kutf_irq_test/build.bp |   21 +-
- .../mali_kutf_irq_test_main.c                 |   15 +-
- .../arm/midgard/thirdparty}/Kbuild            |    9 +-
- .../arm/midgard/thirdparty/mali_kbase_mmap.c  |   77 +-
- .../kernel/drivers/gpu/arm/midgard/tl/Kbuild  |   32 +
- .../tl/backend/mali_kbase_timeline_csf.c      |  171 +
- .../tl/backend/mali_kbase_timeline_jm.c       |   23 +-
- .../gpu/arm/midgard/tl/mali_kbase_timeline.c  |  142 +-
- .../gpu/arm/midgard/tl/mali_kbase_timeline.h  |   57 +-
- .../arm/midgard/tl/mali_kbase_timeline_io.c   |  177 +-
- .../arm/midgard/tl/mali_kbase_timeline_priv.h |   26 +-
- .../arm/midgard/tl/mali_kbase_tl_serialize.h  |    7 +-
- .../gpu/arm/midgard/tl/mali_kbase_tlstream.c  |   43 +-
- .../gpu/arm/midgard/tl/mali_kbase_tlstream.h  |   22 +-
- .../arm/midgard/tl/mali_kbase_tracepoints.c   |  585 +-
- .../arm/midgard/tl/mali_kbase_tracepoints.h   | 1159 +++-
- .../include/linux/dma-buf-test-exporter.h     |    8 +-
- .../include/linux/memory_group_manager.h      |    7 +-
- .../include/linux/priority_control_manager.h  |   77 +
- .../linux/protected_memory_allocator.h        |    7 +-
- .../include/linux/protected_mode_switcher.h   |    7 +-
- .../arm/midgard/csf/mali_base_csf_kernel.h    |  765 +++
- .../csf/mali_gpu_csf_control_registers.h      |   32 +
- .../arm/midgard/csf/mali_gpu_csf_registers.h  | 1488 +++++
- .../arm/midgard/csf/mali_kbase_csf_ioctl.h    |  433 ++
- .../gpu/backend/mali_kbase_gpu_regmap_csf.h   |  335 ++
- .../gpu/backend/mali_kbase_gpu_regmap_jm.h    |   47 +-
- .../midgard/gpu/mali_kbase_gpu_coherency.h    |   13 +-
- .../gpu/arm/midgard/gpu/mali_kbase_gpu_id.h   |   64 +-
- .../arm/midgard/gpu/mali_kbase_gpu_regmap.h   |  434 ++
- .../gpu/arm/midgard/jm/mali_base_jm_kernel.h  |  285 +-
- .../gpu/arm/midgard/jm/mali_kbase_jm_ioctl.h  |  107 +-
- .../uapi}/gpu/arm/midgard/mali_base_kernel.h  |  461 +-
- .../gpu/arm/midgard/mali_base_mem_priv.h      |   23 +-
- .../gpu/arm/midgard/mali_kbase_hwcnt_reader.h |   76 +-
- .../uapi}/gpu/arm/midgard/mali_kbase_ioctl.h  |  212 +-
- .../arm/midgard/mali_kbase_kinstr_jm_reader.h |   69 +
- .../uapi}/gpu/arm/midgard/mali_uk.h           |   46 +-
- 407 files changed, 58537 insertions(+), 10409 deletions(-)
- create mode 100644 dvalin/kernel/Documentation/ABI/testing/sysfs-device-mali
- create mode 100644 dvalin/kernel/Documentation/devicetree/bindings/arm/priority_control_manager.txt
- create mode 100644 dvalin/kernel/drivers/base/arm/Kbuild
- create mode 100644 dvalin/kernel/drivers/base/arm/Kconfig
- create mode 100644 dvalin/kernel/drivers/base/arm/Makefile
- create mode 100644 dvalin/kernel/drivers/base/arm/Mconfig
- rename dvalin/kernel/drivers/base/{ => arm}/dma_buf_lock/src/Kbuild (78%)
- rename dvalin/kernel/drivers/base/{ => arm}/dma_buf_lock/src/Makefile (71%)
- rename dvalin/kernel/drivers/base/{ => arm}/dma_buf_lock/src/dma_buf_lock.c (90%)
- rename dvalin/kernel/drivers/base/{ => arm}/dma_buf_lock/src/dma_buf_lock.h (88%)
- create mode 100644 dvalin/kernel/drivers/base/arm/dma_buf_test_exporter/Kbuild
- create mode 100644 dvalin/kernel/drivers/base/arm/dma_buf_test_exporter/build.bp
- rename dvalin/kernel/drivers/base/{ => arm}/dma_buf_test_exporter/dma-buf-test-exporter.c (89%)
- rename dvalin/kernel/drivers/base/{dma_buf_test_exporter => arm/memory_group_manager}/Kbuild (74%)
- create mode 100644 dvalin/kernel/drivers/base/arm/memory_group_manager/build.bp
- rename dvalin/kernel/drivers/base/{ => arm}/memory_group_manager/memory_group_manager.c (98%)
- create mode 100644 dvalin/kernel/drivers/base/arm/protected_memory_allocator/Kbuild
- create mode 100644 dvalin/kernel/drivers/base/arm/protected_memory_allocator/build.bp
- create mode 100644 dvalin/kernel/drivers/base/arm/protected_memory_allocator/protected_memory_allocator.c
- delete mode 100644 dvalin/kernel/drivers/base/dma_buf_test_exporter/Kconfig
- delete mode 100644 dvalin/kernel/drivers/base/dma_buf_test_exporter/Makefile
- delete mode 100644 dvalin/kernel/drivers/base/dma_buf_test_exporter/build.bp
- delete mode 100644 dvalin/kernel/drivers/base/memory_group_manager/Makefile
- delete mode 100644 dvalin/kernel/drivers/base/memory_group_manager/build.bp
- delete mode 100644 dvalin/kernel/drivers/base/protected_memory_allocator/Makefile
- delete mode 100644 dvalin/kernel/drivers/base/protected_memory_allocator/build.bp
- delete mode 100644 dvalin/kernel/drivers/base/protected_memory_allocator/protected_memory_allocator.c
- rename dvalin/kernel/drivers/{base/protected_memory_allocator/Kbuild => gpu/arm/Makefile} (77%)
- create mode 100644 dvalin/kernel/drivers/gpu/arm/midgard/backend/gpu/mali_kbase_clk_rate_trace_mgr.c
- create mode 100644 dvalin/kernel/drivers/gpu/arm/midgard/backend/gpu/mali_kbase_clk_rate_trace_mgr.h
- delete mode 100755 dvalin/kernel/drivers/gpu/arm/midgard/backend/gpu/mali_kbase_device_hw.c
- delete mode 100644 dvalin/kernel/drivers/gpu/arm/midgard/backend/gpu/mali_kbase_device_internal.h
- create mode 100644 dvalin/kernel/drivers/gpu/arm/midgard/backend/gpu/mali_kbase_pm_mcu_states.h
- rename dvalin/kernel/drivers/{base/memory_group_manager/Kconfig => gpu/arm/midgard/context/Kbuild} (63%)
- create mode 100644 dvalin/kernel/drivers/gpu/arm/midgard/context/backend/mali_kbase_context_csf.c
- create mode 100644 dvalin/kernel/drivers/gpu/arm/midgard/csf/Kbuild
- rename dvalin/kernel/drivers/gpu/arm/midgard/{Makefile.kbase => csf/ipa_control/Kbuild} (75%)
- create mode 100644 dvalin/kernel/drivers/gpu/arm/midgard/csf/ipa_control/mali_kbase_csf_ipa_control.c
- create mode 100644 dvalin/kernel/drivers/gpu/arm/midgard/csf/ipa_control/mali_kbase_csf_ipa_control.h
- create mode 100644 dvalin/kernel/drivers/gpu/arm/midgard/csf/mali_kbase_csf.c
- create mode 100644 dvalin/kernel/drivers/gpu/arm/midgard/csf/mali_kbase_csf.h
- create mode 100644 dvalin/kernel/drivers/gpu/arm/midgard/csf/mali_kbase_csf_cpu_queue_debugfs.c
- create mode 100644 dvalin/kernel/drivers/gpu/arm/midgard/csf/mali_kbase_csf_cpu_queue_debugfs.h
- create mode 100644 dvalin/kernel/drivers/gpu/arm/midgard/csf/mali_kbase_csf_csg_debugfs.c
- create mode 100644 dvalin/kernel/drivers/gpu/arm/midgard/csf/mali_kbase_csf_csg_debugfs.h
- create mode 100644 dvalin/kernel/drivers/gpu/arm/midgard/csf/mali_kbase_csf_defs.h
- create mode 100644 dvalin/kernel/drivers/gpu/arm/midgard/csf/mali_kbase_csf_firmware.c
- create mode 100644 dvalin/kernel/drivers/gpu/arm/midgard/csf/mali_kbase_csf_firmware.h
- create mode 100644 dvalin/kernel/drivers/gpu/arm/midgard/csf/mali_kbase_csf_firmware_cfg.c
- create mode 100644 dvalin/kernel/drivers/gpu/arm/midgard/csf/mali_kbase_csf_firmware_cfg.h
- create mode 100644 dvalin/kernel/drivers/gpu/arm/midgard/csf/mali_kbase_csf_firmware_no_mali.c
- create mode 100644 dvalin/kernel/drivers/gpu/arm/midgard/csf/mali_kbase_csf_heap_context_alloc.c
- create mode 100644 dvalin/kernel/drivers/gpu/arm/midgard/csf/mali_kbase_csf_heap_context_alloc.h
- create mode 100644 dvalin/kernel/drivers/gpu/arm/midgard/csf/mali_kbase_csf_kcpu.c
- create mode 100644 dvalin/kernel/drivers/gpu/arm/midgard/csf/mali_kbase_csf_kcpu.h
- create mode 100644 dvalin/kernel/drivers/gpu/arm/midgard/csf/mali_kbase_csf_kcpu_debugfs.c
- create mode 100644 dvalin/kernel/drivers/gpu/arm/midgard/csf/mali_kbase_csf_kcpu_debugfs.h
- create mode 100644 dvalin/kernel/drivers/gpu/arm/midgard/csf/mali_kbase_csf_protected_memory.c
- create mode 100644 dvalin/kernel/drivers/gpu/arm/midgard/csf/mali_kbase_csf_protected_memory.h
- create mode 100644 dvalin/kernel/drivers/gpu/arm/midgard/csf/mali_kbase_csf_reset_gpu.c
- create mode 100644 dvalin/kernel/drivers/gpu/arm/midgard/csf/mali_kbase_csf_scheduler.c
- create mode 100644 dvalin/kernel/drivers/gpu/arm/midgard/csf/mali_kbase_csf_scheduler.h
- create mode 100644 dvalin/kernel/drivers/gpu/arm/midgard/csf/mali_kbase_csf_tiler_heap.c
- create mode 100644 dvalin/kernel/drivers/gpu/arm/midgard/csf/mali_kbase_csf_tiler_heap.h
- create mode 100644 dvalin/kernel/drivers/gpu/arm/midgard/csf/mali_kbase_csf_tiler_heap_debugfs.c
- create mode 100644 dvalin/kernel/drivers/gpu/arm/midgard/csf/mali_kbase_csf_tiler_heap_debugfs.h
- create mode 100644 dvalin/kernel/drivers/gpu/arm/midgard/csf/mali_kbase_csf_tiler_heap_def.h
- create mode 100644 dvalin/kernel/drivers/gpu/arm/midgard/csf/mali_kbase_csf_timeout.c
- create mode 100644 dvalin/kernel/drivers/gpu/arm/midgard/csf/mali_kbase_csf_timeout.h
- create mode 100644 dvalin/kernel/drivers/gpu/arm/midgard/csf/mali_kbase_csf_tl_reader.c
- create mode 100644 dvalin/kernel/drivers/gpu/arm/midgard/csf/mali_kbase_csf_tl_reader.h
- create mode 100644 dvalin/kernel/drivers/gpu/arm/midgard/csf/mali_kbase_csf_trace_buffer.c
- create mode 100644 dvalin/kernel/drivers/gpu/arm/midgard/csf/mali_kbase_csf_trace_buffer.h
- create mode 100644 dvalin/kernel/drivers/gpu/arm/midgard/debug/Kbuild
- create mode 100644 dvalin/kernel/drivers/gpu/arm/midgard/debug/backend/mali_kbase_debug_ktrace_codes_csf.h
- create mode 100644 dvalin/kernel/drivers/gpu/arm/midgard/debug/backend/mali_kbase_debug_ktrace_csf.c
- create mode 100644 dvalin/kernel/drivers/gpu/arm/midgard/debug/backend/mali_kbase_debug_ktrace_csf.h
- create mode 100644 dvalin/kernel/drivers/gpu/arm/midgard/debug/backend/mali_kbase_debug_ktrace_defs_csf.h
- create mode 100644 dvalin/kernel/drivers/gpu/arm/midgard/debug/backend/mali_kbase_debug_linux_ktrace_csf.h
- rename dvalin/kernel/drivers/gpu/arm/midgard/{tests/kutf/Makefile => device/Kbuild} (56%)
- create mode 100644 dvalin/kernel/drivers/gpu/arm/midgard/device/backend/mali_kbase_device_csf.c
- create mode 100644 dvalin/kernel/drivers/gpu/arm/midgard/device/backend/mali_kbase_device_hw_csf.c
- create mode 100644 dvalin/kernel/drivers/gpu/arm/midgard/device/backend/mali_kbase_device_hw_jm.c
- create mode 100644 dvalin/kernel/drivers/gpu/arm/midgard/device/mali_kbase_device_hw.c
- rename dvalin/kernel/drivers/gpu/arm/midgard/{tests/kutf/Kconfig => gpu/Kbuild} (65%)
- create mode 100644 dvalin/kernel/drivers/gpu/arm/midgard/gpu/backend/mali_kbase_gpu_fault_csf.c
- create mode 100644 dvalin/kernel/drivers/gpu/arm/midgard/ipa/backend/mali_kbase_ipa_counter_common_csf.c
- create mode 100644 dvalin/kernel/drivers/gpu/arm/midgard/ipa/backend/mali_kbase_ipa_counter_common_csf.h
- rename dvalin/kernel/drivers/gpu/arm/midgard/ipa/{mali_kbase_ipa_vinstr_common.c => backend/mali_kbase_ipa_counter_common_jm.c} (95%)
- rename dvalin/kernel/drivers/gpu/arm/midgard/ipa/{mali_kbase_ipa_vinstr_common.h => backend/mali_kbase_ipa_counter_common_jm.h} (85%)
- create mode 100644 dvalin/kernel/drivers/gpu/arm/midgard/ipa/backend/mali_kbase_ipa_counter_csf.c
- rename dvalin/kernel/drivers/gpu/arm/midgard/ipa/{mali_kbase_ipa_vinstr_g7x.c => backend/mali_kbase_ipa_counter_jm.c} (83%)
- mode change 100644 => 100755 dvalin/kernel/drivers/gpu/arm/midgard/ipa/mali_kbase_ipa.c
- create mode 100644 dvalin/kernel/drivers/gpu/arm/midgard/mali_kbase_caps.h
- create mode 100644 dvalin/kernel/drivers/gpu/arm/midgard/mali_kbase_ccswe.c
- create mode 100644 dvalin/kernel/drivers/gpu/arm/midgard/mali_kbase_ccswe.h
- create mode 100644 dvalin/kernel/drivers/gpu/arm/midgard/mali_kbase_dvfs_debugfs.c
- create mode 100644 dvalin/kernel/drivers/gpu/arm/midgard/mali_kbase_dvfs_debugfs.h
- create mode 100644 dvalin/kernel/drivers/gpu/arm/midgard/mali_kbase_fence_ops.c
- create mode 100644 dvalin/kernel/drivers/gpu/arm/midgard/mali_kbase_hwcnt_backend_csf.c
- create mode 100644 dvalin/kernel/drivers/gpu/arm/midgard/mali_kbase_hwcnt_backend_csf.h
- create mode 100644 dvalin/kernel/drivers/gpu/arm/midgard/mali_kbase_hwcnt_backend_csf_if.h
- create mode 100644 dvalin/kernel/drivers/gpu/arm/midgard/mali_kbase_hwcnt_backend_csf_if_fw.c
- create mode 100644 dvalin/kernel/drivers/gpu/arm/midgard/mali_kbase_hwcnt_backend_csf_if_fw.h
- delete mode 100644 dvalin/kernel/drivers/gpu/arm/midgard/mali_kbase_hwcnt_backend_gpu.c
- create mode 100644 dvalin/kernel/drivers/gpu/arm/midgard/mali_kbase_hwcnt_backend_jm.c
- rename dvalin/kernel/drivers/gpu/arm/midgard/{mali_kbase_hwcnt_backend_gpu.h => mali_kbase_hwcnt_backend_jm.h} (75%)
- create mode 100644 dvalin/kernel/drivers/gpu/arm/midgard/mali_kbase_kinstr_jm.c
- create mode 100644 dvalin/kernel/drivers/gpu/arm/midgard/mali_kbase_kinstr_jm.h
- create mode 100644 dvalin/kernel/drivers/gpu/arm/midgard/mali_kbase_trace_gpu_mem.c
- create mode 100644 dvalin/kernel/drivers/gpu/arm/midgard/mali_kbase_trace_gpu_mem.h
- rename dvalin/kernel/drivers/gpu/arm/midgard/{gpu/mali_kbase_gpu.h => mali_power_gpu_frequency_trace.c} (67%)
- create mode 100644 dvalin/kernel/drivers/gpu/arm/midgard/mali_power_gpu_frequency_trace.h
- rename dvalin/kernel/drivers/{base/protected_memory_allocator/Kconfig => gpu/arm/midgard/mmu/Kbuild} (61%)
- create mode 100644 dvalin/kernel/drivers/gpu/arm/midgard/mmu/backend/mali_kbase_mmu_csf.c
- delete mode 100644 dvalin/kernel/drivers/gpu/arm/midgard/mmu/mali_kbase_mmu_mode_lpae.c
- mode change 100644 => 100755 dvalin/kernel/drivers/gpu/arm/midgard/platform/devicetree/Kbuild
- create mode 100644 dvalin/kernel/drivers/gpu/arm/midgard/platform/devicetree/Kbuild.rej
- create mode 100644 dvalin/kernel/drivers/gpu/arm/midgard/platform/devicetree/mali_kbase_clk_rate_trace.c
- mode change 100644 => 100755 dvalin/kernel/drivers/gpu/arm/midgard/platform/devicetree/mali_kbase_config_devicetree.c
- create mode 100644 dvalin/kernel/drivers/gpu/arm/midgard/platform/devicetree/mali_kbase_config_platform.c
- mode change 100644 => 100755 dvalin/kernel/drivers/gpu/arm/midgard/platform/devicetree/mali_kbase_config_platform.h
- create mode 100644 dvalin/kernel/drivers/gpu/arm/midgard/platform/devicetree/mali_kbase_config_platform.h.rej
- mode change 100644 => 100755 dvalin/kernel/drivers/gpu/arm/midgard/platform/devicetree/mali_kbase_runtime_pm.c
- create mode 100644 dvalin/kernel/drivers/gpu/arm/midgard/tests/build.bp
- create mode 100644 dvalin/kernel/drivers/gpu/arm/midgard/tests/mali_kutf_clk_rate_trace/kernel/Kbuild
- create mode 100644 dvalin/kernel/drivers/gpu/arm/midgard/tests/mali_kutf_clk_rate_trace/kernel/build.bp
- create mode 100644 dvalin/kernel/drivers/gpu/arm/midgard/tests/mali_kutf_clk_rate_trace/kernel/mali_kutf_clk_rate_trace_test.c
- create mode 100644 dvalin/kernel/drivers/gpu/arm/midgard/tests/mali_kutf_clk_rate_trace/mali_kutf_clk_rate_trace_test.h
- delete mode 100644 dvalin/kernel/drivers/gpu/arm/midgard/tests/mali_kutf_irq_test/Kconfig
- delete mode 100644 dvalin/kernel/drivers/gpu/arm/midgard/tests/mali_kutf_irq_test/Makefile
- rename dvalin/kernel/drivers/{base/memory_group_manager => gpu/arm/midgard/thirdparty}/Kbuild (82%)
- create mode 100644 dvalin/kernel/drivers/gpu/arm/midgard/tl/Kbuild
- create mode 100644 dvalin/kernel/drivers/gpu/arm/midgard/tl/backend/mali_kbase_timeline_csf.c
- create mode 100644 dvalin/kernel/include/linux/priority_control_manager.h
- create mode 100644 dvalin/kernel/include/uapi/gpu/arm/midgard/csf/mali_base_csf_kernel.h
- create mode 100644 dvalin/kernel/include/uapi/gpu/arm/midgard/csf/mali_gpu_csf_control_registers.h
- create mode 100644 dvalin/kernel/include/uapi/gpu/arm/midgard/csf/mali_gpu_csf_registers.h
- create mode 100644 dvalin/kernel/include/uapi/gpu/arm/midgard/csf/mali_kbase_csf_ioctl.h
- create mode 100644 dvalin/kernel/include/uapi/gpu/arm/midgard/gpu/backend/mali_kbase_gpu_regmap_csf.h
- rename dvalin/kernel/{drivers => include/uapi}/gpu/arm/midgard/gpu/backend/mali_kbase_gpu_regmap_jm.h (89%)
- rename dvalin/kernel/{drivers => include/uapi}/gpu/arm/midgard/gpu/mali_kbase_gpu_coherency.h (75%)
- rename dvalin/kernel/{drivers => include/uapi}/gpu/arm/midgard/gpu/mali_kbase_gpu_id.h (74%)
- create mode 100644 dvalin/kernel/include/uapi/gpu/arm/midgard/gpu/mali_kbase_gpu_regmap.h
- rename dvalin/kernel/{drivers => include/uapi}/gpu/arm/midgard/jm/mali_base_jm_kernel.h (75%)
- rename dvalin/kernel/{drivers => include/uapi}/gpu/arm/midgard/jm/mali_kbase_jm_ioctl.h (57%)
- rename dvalin/kernel/{drivers => include/uapi}/gpu/arm/midgard/mali_base_kernel.h (72%)
- rename dvalin/kernel/{drivers => include/uapi}/gpu/arm/midgard/mali_base_mem_priv.h (80%)
- rename dvalin/kernel/{drivers => include/uapi}/gpu/arm/midgard/mali_kbase_hwcnt_reader.h (52%)
- rename dvalin/kernel/{drivers => include/uapi}/gpu/arm/midgard/mali_kbase_ioctl.h (83%)
- create mode 100644 dvalin/kernel/include/uapi/gpu/arm/midgard/mali_kbase_kinstr_jm_reader.h
- rename dvalin/kernel/{drivers => include/uapi}/gpu/arm/midgard/mali_uk.h (69%)
-
-diff --git a/dvalin/kernel/Documentation/ABI/testing/sysfs-device-mali b/dvalin/kernel/Documentation/ABI/testing/sysfs-device-mali
-new file mode 100644
-index 0000000..99f8ae5
---- /dev/null
-+++ b/dvalin/kernel/Documentation/ABI/testing/sysfs-device-mali
-@@ -0,0 +1,293 @@
-+/*
-+ *
-+ * (C) COPYRIGHT 2020 ARM Limited. All rights reserved.
-+ *
-+ * This program is free software and is provided to you under the terms of the
-+ * GNU General Public License version 2 as published by the Free Software
-+ * Foundation) and any use by you of this program is subject to the terms
-+ * of such GNU licence.
-+ *
-+ * A copy of the licence is included with the program) and can also be obtained
-+ * from Free Software Foundation) Inc.) 51 Franklin Street) Fifth Floor)
-+ * Boston) MA  02110-1301) USA.
-+ *
-+ */
-+
-+What:		/sys/class/misc/mali%u/device/core_mask
-+Description:
-+		This attribute is used to restrict the number of shader cores
-+		available in this instance, is useful for debugging purposes.
-+		Reading this attribute provides us mask of all cores available.
-+		Writing to it will set the current core mask. Doesn't
-+		allow disabling all the cores present in this instance.
-+
-+What:		/sys/class/misc/mali%u/device/debug_command
-+Description:
-+		This attribute is used to issue debug commands that supported
-+		by the driver. On reading it provides the list of debug commands
-+		that are supported, and writing back one of those commands will
-+		enable that debug option.
-+
-+What:		/sys/class/misc/mali%u/device/dvfs_period
-+Description:
-+		This is used to set the DVFS sampling period to be used by the
-+		driver, On reading it provides the current DVFS sampling period,
-+		on writing a value we set the DVFS sampling period.
-+
-+What:		/sys/class/misc/mali%u/device/dummy_job_wa_info
-+Description:
-+		This attribute is available only with platform device that
-+                supports a Job Manager based GPU that requires a GPU workaround
-+		to execute the dummy fragment job on all shader cores to
-+		workaround a hang issue.
-+
-+		Its a readonly attribute and on reading gives details on the
-+		options used with the dummy workaround.
-+
-+What:		/sys/class/misc/mali%u/device/fw_timeout
-+Description:
-+		This attribute is available only with mali platform
-+		device-driver that supports a CSF GPU. This attribute is
-+		used to set the duration value in milliseconds for the
-+		waiting timeout used for a GPU status change request being
-+		acknowledged by the FW.
-+
-+What:		/sys/class/misc/mali%u/device/gpuinfo
-+Description:
-+		This attribute provides description of the present Mali GPU.
-+		Its a read only attribute provides details like GPU family, the
-+		number of cores, the hardware version and the raw product id.
-+
-+What:		/sys/class/misc/mali%u/device/idle_hysteresis_time
-+Description:
-+		This attribute is available only with mali platform
-+		device-driver that supports a CSF GPU. This attribute is
-+		used to set the duration value in milliseconds for the
-+		configuring hysteresis field for determining GPU idle detection.
-+
-+What:		/sys/class/misc/mali%u/device/js_ctx_scheduling_mode
-+Description:
-+		This attribute is available only with platform device that
-+		supports a Job Manager based GPU. This attribute is used to set
-+		context scheduling priority for a job slot.
-+
-+		On Reading it provides the currently set job slot context
-+		priority.
-+
-+		Writing 0 to this attribute sets it to the mode were
-+		higher priority atoms will be scheduled first, regardless of
-+		the context they belong to. Newly-runnable higher priority atoms
-+		can preempt lower priority atoms currently running on the GPU,
-+		even if they belong to a different context.
-+
-+		Writing 1 to this attribute set it to the mode were the
-+		highest-priority atom will be chosen from each context in turn
-+		using a round-robin algorithm, so priority only has an effect
-+		within the context an atom belongs to. Newly-runnable higher
-+		priority atoms can preempt the lower priority atoms currently
-+		running on the GPU, but only if they belong to the same context.
-+
-+What:		/sys/class/misc/mali%u/device/js_scheduling_period
-+Description:
-+		This attribute is available only with platform device that
-+                supports a Job Manager based GPU. Used to set the job scheduler
-+		tick period in nano-seconds. The Job Scheduler determines the
-+		jobs that are run on the GPU, and for how long, Job Scheduler
-+		makes decisions at a regular time interval determined by value
-+		in js_scheduling_period.
-+
-+What:		/sys/class/misc/mali%u/device/js_softstop_always
-+Description:
-+		This attribute is available only with platform device that
-+                supports a Job Manager based GPU. Soft-stops are disabled when
-+		only a single context is present, this attribute is used to
-+		enable soft-stop when only a single context is present can be
-+		used for debug and unit-testing purposes.
-+
-+What:		/sys/class/misc/mali%u/device/js_timeouts
-+Description:
-+		This attribute is available only with platform device that
-+                supports a Job Manager based GPU. It used to set the soft stop
-+		and hard stop times for the job scheduler.
-+
-+		Writing value 0 causes no change, or -1 to restore the
-+		default timeout.
-+
-+		The format used to set js_timeouts is
-+		"<soft_stop_ms> <soft_stop_ms_cl> <hard_stop_ms_ss>
-+		<hard_stop_ms_cl> <hard_stop_ms_dumping> <reset_ms_ss>
-+		<reset_ms_cl> <reset_ms_dumping>"
-+
-+
-+What:		/sys/class/misc/mali%u/device/lp_mem_pool_max_size
-+Description:
-+		This attribute is used to set the maximum number of large pages
-+		memory pools that the driver can contain. Large pages are of
-+		size 2MB. On read it displays all the max size of all memory
-+		pools and can be used to modify each individual pools as well.
-+
-+What:		/sys/class/misc/mali%u/device/lp_mem_pool_size
-+Description:
-+		This attribute is used to set the number of large memory pages
-+		which should be	populated, changing this value may cause
-+		existing pages to be removed from the pool, or new pages to be
-+		created and then added to the pool. On read it will provide
-+		pool size for all available pools and we can modify individual
-+		pool.
-+
-+What:		/sys/class/misc/mali%u/device/mem_pool_max_size
-+Description:
-+		This attribute is used to set the maximum number of small pages
-+		for memory pools that the driver can contain. Here small pages
-+		are of size 4KB. On read it will display the max size for all
-+		available pools and allows us to set max size of
-+		individual pools.
-+
-+What:		/sys/class/misc/mali%u/device/mem_pool_size
-+Description:
-+		This attribute is used to set the number of small memory pages
-+		which should be populated, changing this value may cause
-+		existing pages to be removed from the pool, or new pages to
-+		be created and then added to the pool. On read it will provide
-+		pool size for all available pools and we can modify individual
-+		pool.
-+
-+What:		/sys/class/misc/mali%u/device/device/mempool/ctx_default_max_size
-+Description:
-+		This attribute is used to set maximum memory pool size for
-+		all the memory pool so that the maximum amount of free memory
-+		that each pool can hold is identical.
-+
-+What:		/sys/class/misc/mali%u/device/device/mempool/lp_max_size
-+Description:
-+		This attribute is used to set the maximum number of large pages
-+		for all memory pools that the driver can contain.
-+		Large pages are of size 2MB.
-+
-+What:		/sys/class/misc/mali%u/device/device/mempool/max_size
-+Description:
-+		This attribute is used to set the maximum number of small pages
-+		for all the memory pools that the driver can contain.
-+		Here small pages are of size 4KB.
-+
-+What:		/sys/class/misc/mali%u/device/pm_poweroff
-+Description:
-+		This attribute contains the current values, represented as the
-+		following space-separated integers:
-+		• PM_GPU_POWEROFF_TICK_NS.
-+		• PM_POWEROFF_TICK_SHADER.
-+		• PM_POWEROFF_TICK_GPU.
-+
-+		Example:
-+		echo 100000 4 4 > /sys/class/misc/mali0/device/pm_poweroff
-+
-+		Sets the following new values: 100,000ns tick, four ticks
-+		for shader power down, and four ticks for GPU power down.
-+
-+What:		/sys/class/misc/mali%u/device/power_policy
-+Description:
-+		This attribute is used to find the current power policy been
-+		used, reading will list the power policies available and
-+		enclosed in square bracket is the current one been selected.
-+
-+		Example:
-+		cat /sys/class/misc/mali0/device/power_policy
-+		[demand] coarse_demand always_on
-+
-+		To switch to a different policy at runtime write the valid entry
-+		name back to the attribute.
-+
-+		Example:
-+		echo "coarse_demand" > /sys/class/misc/mali0/device/power_policy
-+
-+What:		/sys/class/misc/mali%u/device/progress_timeout
-+Description:
-+		This attribute is available only with mali platform
-+		device-driver that supports a CSF GPU. This attribute
-+		is used to set the progress timeout value and read the current
-+		progress timeout value.
-+
-+		Progress timeout value is the maximum number of GPU cycles
-+		without forward progress to allow to elapse before terminating a
-+		GPU command queue group.
-+
-+What:		/sys/class/misc/mali%u/device/reset_timeout
-+Description:
-+		This attribute is used to set the number of milliseconds to
-+		wait for the soft stop to complete for the GPU jobs before
-+		proceeding with the GPU reset.
-+
-+What:		/sys/class/misc/mali%u/device/soft_job_timeout
-+Description:
-+		This attribute is available only with platform device that
-+                supports a Job Manager based GPU. It used to set the timeout
-+		value for waiting for any soft event to complete.
-+
-+What:		/sys/class/misc/mali%u/device/scheduling/serialize_jobs
-+Description:
-+		This attribute is available only with platform device that
-+                supports a Job Manager based GPU.
-+
-+		Various options available under this are:
-+		• none - for disabling serialization.
-+		• intra-slot - Serialize atoms within a slot, only one
-+				atom per job slot.
-+		• inter-slot - Serialize atoms between slots, only one
-+				job slot running at any time.
-+		• full - it a combination of both inter and intra slot,
-+				so only one atom and one job slot running
-+				at any time.
-+		• full-reset - full serialization and Reset the GPU after
-+				each atom completion
-+
-+		These options are useful for debugging and investigating
-+		failures and gpu hangs to narrow down atoms that could cause
-+		troubles.
-+
-+What:		/sys/class/misc/mali%u/device/firmware_config/Compute iterator count/*
-+Description:
-+		This attribute is available only with mali platform
-+		device-driver that supports a CSF GPU. Its a read-only attribute
-+		which indicates the maximum number of Compute iterators
-+		supported by the GPU.
-+
-+What:		/sys/class/misc/mali%u/device/firmware_config/CSHWIF count/*
-+Description:
-+		This attribute is available only with mali platform
-+		device-driver that supports a CSF GPU. Its a read-only
-+		attribute which indicates the maximum number of	CSHWIFs
-+		supported by the GPU.
-+
-+What:		/sys/class/misc/mali%u/device/firmware_config/Fragment iterator count/*
-+Description:
-+		This attribute is available only with mali platform
-+		device-driver that supports a CSF GPU. Its a read-only
-+		attribute which indicates the maximum number of
-+		Fragment iterators supported by the GPU.
-+
-+What:		/sys/class/misc/mali%u/device/firmware_config/Scoreboard set count/*
-+Description:
-+		This attribute is available only with mali platform
-+		device-driver that supports a CSF GPU. Its a read-only
-+		attribute which indicates the maximum number of
-+		Scoreboard set supported by the GPU.
-+
-+What:		/sys/class/misc/mali%u/device/firmware_config/Tiler iterator count/*
-+Description:
-+		This attribute is available only with mali platform
-+		device-driver that supports a CSF GPU. Its a read-only
-+		attribute which indicates the maximum number of	Tiler iterators
-+		supported by the GPU.
-+
-+What:		/sys/class/misc/mali%u/device/firmware_config/Log verbosity/*
-+Description:
-+		This attribute is available only with mali platform
-+                device-driver that supports a CSF GPU.
-+
-+		Used to enable firmware logs, logging levels valid values
-+		are indicated using 'min and 'max' attribute values
-+		values that are read-only.
-+
-+		Log level can be set using the 'cur' read, write attribute,
-+		we can use a valid log level value from min and max range values
-+		and set a valid desired log level for firmware logs.
-diff --git a/dvalin/kernel/Documentation/devicetree/bindings/arm/mali-midgard.txt b/dvalin/kernel/Documentation/devicetree/bindings/arm/mali-midgard.txt
-index dd8f733..a74d569 100644
---- a/dvalin/kernel/Documentation/devicetree/bindings/arm/mali-midgard.txt
-+++ b/dvalin/kernel/Documentation/devicetree/bindings/arm/mali-midgard.txt
-@@ -1,10 +1,11 @@
-+# SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note
- #
--# (C) COPYRIGHT 2013-2020 ARM Limited. All rights reserved.
-+# (C) COPYRIGHT 2013-2021 ARM Limited. All rights reserved.
- #
- # This program is free software and is provided to you under the terms of the
- # GNU General Public License version 2 as published by the Free Software
- # Foundation, and any use by you of this program is subject to the terms
--# of such GNU licence.
-+# of such GNU license.
- #
- # This program is distributed in the hope that it will be useful,
- # but WITHOUT ANY WARRANTY; without even the implied warranty of
-@@ -15,8 +16,6 @@
- # along with this program; if not, you can access it online at
- # http://www.gnu.org/licenses/gpl-2.0.html.
- #
--# SPDX-License-Identifier: GPL-2.0
--#
- #
- 
- * ARM Mali Midgard / Bifrost devices
-@@ -46,12 +45,12 @@ Documentation/devicetree/bindings/regulator/regulator.txt for details.
-                        This is optional.
- - operating-points-v2 : Refer to Documentation/devicetree/bindings/power/mali-opp.txt
- for details.
--- quirks_jm : Used to write to the JM_CONFIG register or equivalent.
-+- quirks_gpu : Used to write to the JM_CONFIG or CSF_CONFIG register.
- 	  Should be used with care. Options passed here are used to override
- 	  certain default behavior. Note: This will override 'idvs-group-size'
- 	  field in devicetree and module param 'corestack_driver_control',
--	  therefore if 'quirks_jm' is used then 'idvs-group-size' and
--	  'corestack_driver_control' value should be incorporated into 'quirks_jm'.
-+	  therefore if 'quirks_gpu' is used then 'idvs-group-size' and
-+	  'corestack_driver_control' value should be incorporated into 'quirks_gpu'.
- - quirks_sc : Used to write to the SHADER_CONFIG register.
- 	  Should be used with care. Options passed here are used to override
- 	  certain default behavior.
-@@ -64,8 +63,8 @@ for details.
- - power_model : Sets the power model parameters. Defined power models include:
- 	  "mali-simple-power-model", "mali-g51-power-model", "mali-g52-power-model",
- 	  "mali-g52_r1-power-model", "mali-g71-power-model", "mali-g72-power-model",
--	  "mali-g76-power-model", "mali-g77-power-model", "mali-tnax-power-model"
--	  and "mali-tbex-power-model".
-+	  "mali-g76-power-model", "mali-g77-power-model", "mali-tnax-power-model",
-+	  "mali-tbex-power-model" and "mali-tbax-power-model".
- 	- mali-simple-power-model: this model derives the GPU power usage based
- 	  on the GPU voltage scaled by the system temperature. Note: it was
- 	  designed for the Juno platform, and may not be suitable for others.
-@@ -98,6 +97,8 @@ for details.
- 	  are used at different points so care should be taken to configure
- 	  both power models in the device tree (specifically dynamic-coefficient,
- 	  static-coefficient and scale) to best match the platform.
-+- power_policy : Sets the GPU power policy at probe time. Available options are
-+                 "coarse_demand" and "always_on". If not set, then "coarse_demand" is used.
- - system-coherency : Sets the coherency protocol to be used for coherent
- 		     accesses made from the GPU.
- 		     If not set then no coherency is used.
-diff --git a/dvalin/kernel/Documentation/devicetree/bindings/arm/memory_group_manager.txt b/dvalin/kernel/Documentation/devicetree/bindings/arm/memory_group_manager.txt
-index fda8f00..634973f 100644
---- a/dvalin/kernel/Documentation/devicetree/bindings/arm/memory_group_manager.txt
-+++ b/dvalin/kernel/Documentation/devicetree/bindings/arm/memory_group_manager.txt
-@@ -1,10 +1,11 @@
-+# SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note
- #
--# (C) COPYRIGHT 2019 ARM Limited. All rights reserved.
-+# (C) COPYRIGHT 2019-2021 ARM Limited. All rights reserved.
- #
- # This program is free software and is provided to you under the terms of the
- # GNU General Public License version 2 as published by the Free Software
- # Foundation, and any use by you of this program is subject to the terms
--# of such GNU licence.
-+# of such GNU license.
- #
- # This program is distributed in the hope that it will be useful,
- # but WITHOUT ANY WARRANTY; without even the implied warranty of
-@@ -15,8 +16,6 @@
- # along with this program; if not, you can access it online at
- # http://www.gnu.org/licenses/gpl-2.0.html.
- #
--# SPDX-License-Identifier: GPL-2.0
--#
- #
- 
- * Arm memory group manager for Mali GPU device drivers
-diff --git a/dvalin/kernel/Documentation/devicetree/bindings/arm/priority_control_manager.txt b/dvalin/kernel/Documentation/devicetree/bindings/arm/priority_control_manager.txt
-new file mode 100644
-index 0000000..c7dd14f
---- /dev/null
-+++ b/dvalin/kernel/Documentation/devicetree/bindings/arm/priority_control_manager.txt
-@@ -0,0 +1,48 @@
-+# SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note
-+#
-+# (C) COPYRIGHT 2020-2021 ARM Limited. All rights reserved.
-+#
-+# This program is free software and is provided to you under the terms of the
-+# GNU General Public License version 2 as published by the Free Software
-+# Foundation, and any use by you of this program is subject to the terms
-+# of such GNU license.
-+#
-+# This program is distributed in the hope that it will be useful,
-+# but WITHOUT ANY WARRANTY; without even the implied warranty of
-+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-+# GNU General Public License for more details.
-+#
-+# You should have received a copy of the GNU General Public License
-+# along with this program; if not, you can access it online at
-+# http://www.gnu.org/licenses/gpl-2.0.html.
-+#
-+#
-+
-+* Arm priority control manager for Mali GPU device drivers
-+
-+Required properties:
-+
-+- compatible: Must be "arm,priority-control-manager"
-+
-+An example node:
-+
-+        gpu_priority_control_manager: priority-control-manager {
-+                compatible = "arm,priority-control-manager";
-+        };
-+
-+It must be referenced by the GPU as well, see priority-control-manager:
-+
-+	gpu: gpu@0x6e000000 {
-+		compatible = "arm,mali-midgard";
-+		reg = <0x0 0x6e000000 0x0 0x200000>;
-+		interrupts = <0 168 4>, <0 168 4>, <0 168 4>;
-+		interrupt-names = "JOB", "MMU", "GPU";
-+		clocks = <&scpi_dvfs 2>;
-+		clock-names = "clk_mali";
-+		system-coherency = <31>;
-+		priority-control-manager = <&gpu_priority_control_manager>;
-+		operating-points = <
-+			/* KHz uV */
-+			50000 820000
-+		>;
-+	};
-diff --git a/dvalin/kernel/Documentation/devicetree/bindings/arm/protected_memory_allocator.txt b/dvalin/kernel/Documentation/devicetree/bindings/arm/protected_memory_allocator.txt
-index f054348..89a3cc7 100644
---- a/dvalin/kernel/Documentation/devicetree/bindings/arm/protected_memory_allocator.txt
-+++ b/dvalin/kernel/Documentation/devicetree/bindings/arm/protected_memory_allocator.txt
-@@ -1,10 +1,11 @@
-+# SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note
- #
--# (C) COPYRIGHT 2019 ARM Limited. All rights reserved.
-+# (C) COPYRIGHT 2019-2021 ARM Limited. All rights reserved.
- #
- # This program is free software and is provided to you under the terms of the
- # GNU General Public License version 2 as published by the Free Software
- # Foundation, and any use by you of this program is subject to the terms
--# of such GNU licence.
-+# of such GNU license.
- #
- # This program is distributed in the hope that it will be useful,
- # but WITHOUT ANY WARRANTY; without even the implied warranty of
-@@ -15,8 +16,6 @@
- # along with this program; if not, you can access it online at
- # http://www.gnu.org/licenses/gpl-2.0.html.
- #
--# SPDX-License-Identifier: GPL-2.0
--#
- #
- 
- * Arm protected memory allocator for Mali GPU device drivers
-diff --git a/dvalin/kernel/Documentation/devicetree/bindings/power/mali-opp.txt b/dvalin/kernel/Documentation/devicetree/bindings/power/mali-opp.txt
-index 49ed773..b9c0743 100644
---- a/dvalin/kernel/Documentation/devicetree/bindings/power/mali-opp.txt
-+++ b/dvalin/kernel/Documentation/devicetree/bindings/power/mali-opp.txt
-@@ -1,10 +1,11 @@
-+# SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note
- #
--# (C) COPYRIGHT 2017, 2019 ARM Limited. All rights reserved.
-+# (C) COPYRIGHT 2017, 2019-2021 ARM Limited. All rights reserved.
- #
- # This program is free software and is provided to you under the terms of the
- # GNU General Public License version 2 as published by the Free Software
- # Foundation, and any use by you of this program is subject to the terms
--# of such GNU licence.
-+# of such GNU license.
- #
- # This program is distributed in the hope that it will be useful,
- # but WITHOUT ANY WARRANTY; without even the implied warranty of
-@@ -15,8 +16,6 @@
- # along with this program; if not, you can access it online at
- # http://www.gnu.org/licenses/gpl-2.0.html.
- #
--# SPDX-License-Identifier: GPL-2.0
--#
- #
- 
- * ARM Mali Midgard OPP
-@@ -54,7 +53,7 @@ Optional properties:
- 
- - opp-core-count: Number of cores to use for this OPP. If this is present then
-   the driver will build a core mask using the available core mask provided by
--  the GPU hardware.
-+  the GPU hardware. An opp-core-count value of 0 is not permitted.
- 
-   If neither this nor opp-core-mask are present then all shader cores will be
-   used for this OPP.
-diff --git a/dvalin/kernel/Documentation/dma-buf-test-exporter.txt b/dvalin/kernel/Documentation/dma-buf-test-exporter.txt
-index 8d8cbc9..b01020c 100644
---- a/dvalin/kernel/Documentation/dma-buf-test-exporter.txt
-+++ b/dvalin/kernel/Documentation/dma-buf-test-exporter.txt
-@@ -1,10 +1,11 @@
-+# SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note
- #
--# (C) COPYRIGHT 2012-2013 ARM Limited. All rights reserved.
-+# (C) COPYRIGHT 2012-2013, 2020-2021 ARM Limited. All rights reserved.
- #
- # This program is free software and is provided to you under the terms of the
- # GNU General Public License version 2 as published by the Free Software
- # Foundation, and any use by you of this program is subject to the terms
--# of such GNU licence.
-+# of such GNU license.
- #
- # This program is distributed in the hope that it will be useful,
- # but WITHOUT ANY WARRANTY; without even the implied warranty of
-@@ -15,10 +16,7 @@
- # along with this program; if not, you can access it online at
- # http://www.gnu.org/licenses/gpl-2.0.html.
- #
--# SPDX-License-Identifier: GPL-2.0
- #
--#
--
- 
- =====================
- dma-buf-test-exporter
-@@ -42,5 +40,3 @@ It supports being compiled as a module both in-tree and out-of-tree.
- 
- See include/linux/dma-buf-test-exporter.h for the ioctl interface.
- See Documentation/dma-buf-sharing.txt for details on dma_buf.
--
--
-diff --git a/dvalin/kernel/Mconfig b/dvalin/kernel/Mconfig
-index e451591..217715c 100644
---- a/dvalin/kernel/Mconfig
-+++ b/dvalin/kernel/Mconfig
-@@ -1,27 +1,26 @@
-+# SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note
- #
--#
--# (C) COPYRIGHT 2017-2020 ARM Limited. All rights reserved.
-+# (C) COPYRIGHT 2017-2021 ARM Limited. All rights reserved.
- #
- # This program is free software and is provided to you under the terms of the
- # GNU General Public License version 2 as published by the Free Software
- # Foundation, and any use by you of this program is subject to the terms
--# of such GNU licence.
-+# of such GNU license.
-+#
-+# This program is distributed in the hope that it will be useful,
-+# but WITHOUT ANY WARRANTY; without even the implied warranty of
-+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-+# GNU General Public License for more details.
- #
--# A copy of the licence is included with the program, and can also be obtained
--# from Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
--# Boston, MA 02110-1301, USA.
-+# You should have received a copy of the GNU General Public License
-+# along with this program; if not, you can access it online at
-+# http://www.gnu.org/licenses/gpl-2.0.html.
- #
- #
- 
--source "kernel/drivers/gpu/arm/midgard/Mconfig"
--source "kernel/drivers/gpu/arm/midgard/arbitration/Mconfig"
-+menu "Kernel menu"
- 
--config DMA_BUF_SYNC_IOCTL_SUPPORTED
--	bool "Kernel DMA buffers support DMA_BUF_IOCTL_SYNC"
--	depends on BACKEND_KERNEL
--	default y
-+source "kernel/drivers/base/arm/Mconfig"
-+source "kernel/drivers/gpu/arm/midgard/Mconfig"
- 
--config BUILD_CSF_ONLY_MODULE
--	bool "Build CSF GPU specific kernel modules"
--	depends on BUILD_KERNEL_MODULES && GPU_HAS_CSF
--	default y
-+endmenu
-diff --git a/dvalin/kernel/build.bp b/dvalin/kernel/build.bp
-index 2bc725f..c97da2c 100644
---- a/dvalin/kernel/build.bp
-+++ b/dvalin/kernel/build.bp
-@@ -1,15 +1,21 @@
-+/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
- /*
-  *
-- * (C) COPYRIGHT 2016-2020 ARM Limited. All rights reserved.
-+ * (C) COPYRIGHT 2016-2021 ARM Limited. All rights reserved.
-  *
-  * This program is free software and is provided to you under the terms of the
-  * GNU General Public License version 2 as published by the Free Software
-  * Foundation, and any use by you of this program is subject to the terms
-- * of such GNU licence.
-+ * of such GNU license.
-  *
-- * A copy of the licence is included with the program, and can also be obtained
-- * from Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
-- * Boston, MA 02110-1301, USA.
-+ * This program is distributed in the hope that it will be useful,
-+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
-+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-+ * GNU General Public License for more details.
-+ *
-+ * You should have received a copy of the GNU General Public License
-+ * along with this program; if not, you can access it online at
-+ * http://www.gnu.org/licenses/gpl-2.0.html.
-  *
-  */
- 
-@@ -25,6 +31,7 @@ bob_install_group {
- 
- bob_defaults {
-     name: "kernel_defaults",
-+    build_by_default: false,
-     enabled: false,
-     exclude_srcs: [
-         "**/*.mod.c",
-@@ -33,6 +40,7 @@ bob_defaults {
-         "include",
-     ],
-     build_kernel_modules: {
-+        build_by_default: true,
-         enabled: true,
-         kernel_dir: "{{.kernel_dir}}",
-         kernel_cross_compile: "{{.kernel_compiler}}",
-@@ -42,6 +50,8 @@ bob_defaults {
-         kernel_ld: "{{.kernel_ld}}",
-     },
-     install_group: "IG_kernel_modules",
-+    add_to_alias: ["kernel"],
-+    owner: "{{.android_module_owner}}",
-     cflags: [
-         "-Wall",
-     ],
-@@ -54,49 +64,12 @@ bob_defaults {
-             "optional",
-         ],
-     },
--    kbuild_options: [
--        // Start of CS experimental features definitions.
--        // If there is nothing below, definition should be added as follows:
--        // "MALI_EXPERIMENTAL_FEATURE={{.experimental_feature}}"
--        // experimental_feature above comes from Mconfig in
--        // <ddk_root>/product/base/
--        // However, in Mconfig, experimental_feature should be looked up (for
--        // similar explanation to this one) as ALLCAPS, i.e.
--        // EXPERIMENTAL_FEATURE.
--        //
--        // IMPORTANT: MALI_CS_EXPERIMENTAL should NEVER be defined below as it
--        // is an umbrella feature that would be open for inappropriate use
--        // (catch-all for experimental CS code without separating it into
--        // different features).
--        "MALI_JIT_PRESSURE_LIMIT={{.jit_pressure_limit}}",
--        "MALI_INCREMENTAL_RENDERING={{.incremental_rendering}}",
--    ],
--}
--
--bob_defaults {
--    name: "kutf_includes",
--    local_include_dirs: [
--        "drivers/gpu/arm/midgard/tests/include",
--    ],
--}
--
--bob_defaults {
--    name: "kernel_test_includes",
--    defaults: ["kutf_includes"],
--    local_include_dirs: [
--        "drivers/gpu/arm",
--        "drivers/gpu/arm/midgard",
--        "drivers/gpu/arm/midgard/backend/gpu",
--        "drivers/gpu/arm/midgard/debug",
--        "drivers/gpu/arm/midgard/debug/backend",
--    ],
- }
- 
-+// Alias for all kernel modules. `kernel_defaults` uses `add_to_alias` to
-+// ensure any modules using that are included in this alias; any
-+// bob_kernel_modules not using those defaults must explicitly use
-+// `add_to_alias` or be listed here.
- bob_alias {
-     name: "kernel",
--    srcs: [
--        "dma-buf-test-exporter",
--        "memory_group_manager",
--        "mali_kbase",
--    ],
- }
-diff --git a/dvalin/kernel/drivers/base/arm/Kbuild b/dvalin/kernel/drivers/base/arm/Kbuild
-new file mode 100644
-index 0000000..b0fbf93
---- /dev/null
-+++ b/dvalin/kernel/drivers/base/arm/Kbuild
-@@ -0,0 +1,34 @@
-+# SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note
-+#
-+# (C) COPYRIGHT 2021 ARM Limited. All rights reserved.
-+#
-+# This program is free software and is provided to you under the terms of the
-+# GNU General Public License version 2 as published by the Free Software
-+# Foundation, and any use by you of this program is subject to the terms
-+# of such GNU license.
-+#
-+# This program is distributed in the hope that it will be useful,
-+# but WITHOUT ANY WARRANTY; without even the implied warranty of
-+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-+# GNU General Public License for more details.
-+#
-+# You should have received a copy of the GNU General Public License
-+# along with this program; if not, you can access it online at
-+# http://www.gnu.org/licenses/gpl-2.0.html.
-+#
-+#
-+
-+#
-+# ccflags
-+#
-+ccflags-y += -I$(src)/../../../include
-+
-+subdir-ccflags-y += $(ccflags-y)
-+
-+#
-+# Kernel modules
-+#
-+obj-$(CONFIG_DMA_SHARED_BUFFER_TEST_EXPORTER) += dma_buf_test_exporter/
-+obj-$(CONFIG_MALI_MEMORY_GROUP_MANAGER) += memory_group_manager/
-+obj-$(CONFIG_MALI_PROTECTED_MEMORY_ALLOCATOR) += protected_memory_allocator/
-+
-diff --git a/dvalin/kernel/drivers/base/arm/Kconfig b/dvalin/kernel/drivers/base/arm/Kconfig
-new file mode 100644
-index 0000000..75d5434
---- /dev/null
-+++ b/dvalin/kernel/drivers/base/arm/Kconfig
-@@ -0,0 +1,64 @@
-+# SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note
-+#
-+# (C) COPYRIGHT 2021 ARM Limited. All rights reserved.
-+#
-+# This program is free software and is provided to you under the terms of the
-+# GNU General Public License version 2 as published by the Free Software
-+# Foundation, and any use by you of this program is subject to the terms
-+# of such GNU license.
-+#
-+# This program is distributed in the hope that it will be useful,
-+# but WITHOUT ANY WARRANTY; without even the implied warranty of
-+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-+# GNU General Public License for more details.
-+#
-+# You should have received a copy of the GNU General Public License
-+# along with this program; if not, you can access it online at
-+# http://www.gnu.org/licenses/gpl-2.0.html.
-+#
-+#
-+
-+menuconfig MALI_BASE_MODULES
-+	bool "Mali Base extra modules"
-+	default n
-+	help
-+	  Enable this option to build support for a Arm Mali base modules.
-+	  Those modules provide extra features or debug interfaces and,
-+	  are optional for the use of the Mali GPU modules.
-+
-+config DMA_SHARED_BUFFER_TEST_EXPORTER
-+	bool "Build dma-buf framework test exporter module"
-+	depends on MALI_BASE_MODULES && DMA_SHARED_BUFFER
-+	default y
-+	help
-+	  This option will build the dma-buf framework test exporter module.
-+	  Usable to help test importers.
-+
-+	  Modules:
-+	    - dma-buf-test-exporter.ko
-+
-+config MALI_MEMORY_GROUP_MANAGER
-+	bool "Build Mali Memory Group Manager module"
-+	depends on MALI_BASE_MODULES
-+	default y
-+	help
-+	  This option will build the memory group manager module.
-+	  This is an example implementation for allocation and release of pages
-+	  for memory pools managed by Mali GPU device drivers.
-+
-+	  Modules:
-+	    - memory_group_manager.ko
-+
-+config MALI_PROTECTED_MEMORY_ALLOCATOR
-+	bool "Build Mali Protected Memory Allocator module"
-+	depends on MALI_BASE_MODULES && MALI_CSF_SUPPORT
-+	default y
-+	help
-+	  This option will build the protected memory allocator module.
-+	  This is an example implementation for allocation and release of pages
-+	  of secure memory intended to be used by the firmware
-+	  of Mali GPU device drivers.
-+
-+	  Modules:
-+	    - protected_memory_allocator.ko
-+
-diff --git a/dvalin/kernel/drivers/base/arm/Makefile b/dvalin/kernel/drivers/base/arm/Makefile
-new file mode 100644
-index 0000000..0bd6ab5
---- /dev/null
-+++ b/dvalin/kernel/drivers/base/arm/Makefile
-@@ -0,0 +1,98 @@
-+# SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note
-+#
-+# (C) COPYRIGHT 2021 ARM Limited. All rights reserved.
-+#
-+# This program is free software and is provided to you under the terms of the
-+# GNU General Public License version 2 as published by the Free Software
-+# Foundation, and any use by you of this program is subject to the terms
-+# of such GNU license.
-+#
-+# This program is distributed in the hope that it will be useful,
-+# but WITHOUT ANY WARRANTY; without even the implied warranty of
-+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-+# GNU General Public License for more details.
-+#
-+# You should have received a copy of the GNU General Public License
-+# along with this program; if not, you can access it online at
-+# http://www.gnu.org/licenses/gpl-2.0.html.
-+#
-+#
-+
-+#
-+# Paths
-+#
-+KERNEL_SRC ?= /lib/modules/$(shell uname -r)/build
-+KDIR ?= $(KERNEL_SRC)
-+
-+ifeq ($(KDIR),)
-+    $(error Must specify KDIR to point to the kernel to target))
-+endif
-+
-+vars :=
-+#
-+# Default configuration values
-+#
-+CONFIG_MALI_BASE_MODULES ?= n
-+
-+ifeq ($(CONFIG_MALI_BASE_MODULES),y)
-+    CONFIG_MALI_CSF_SUPPORT ?= n
-+
-+    ifneq ($(CONFIG_DMA_SHARED_BUFFER),n)
-+        CONFIG_DMA_SHARED_BUFFER_TEST_EXPORTER ?= y
-+    else
-+        # Prevent misuse when CONFIG_DMA_SHARED_BUFFER=n
-+        CONFIG_DMA_SHARED_BUFFER_TEST_EXPORTER = n
-+    endif
-+
-+    CONFIG_MALI_MEMORY_GROUP_MANAGER ?= y
-+
-+    ifneq ($(CONFIG_MALI_CSF_SUPPORT), n)
-+        CONFIG_MALI_PROTECTED_MEMORY_ALLOCATOR ?= y
-+    endif
-+
-+else
-+    # Prevent misuse when CONFIG_MALI_BASE_MODULES=n
-+    CONFIG_DMA_SHARED_BUFFER_TEST_EXPORTER = n
-+    CONFIG_MALI_MEMORY_GROUP_MANAGER = n
-+    CONFIG_MALI_PROTECTED_MEMORY_ALLOCATOR = n
-+
-+endif
-+
-+CONFIGS := \
-+    CONFIG_MALI_BASE_MODULES \
-+    CONFIG_MALI_CSF_SUPPORT \
-+    CONFIG_DMA_SHARED_BUFFER_TEST_EXPORTER \
-+    CONFIG_MALI_MEMORY_GROUP_MANAGER \
-+    CONFIG_MALI_PROTECTED_MEMORY_ALLOCATOR
-+
-+
-+#
-+# MAKE_ARGS to pass the custom CONFIGs on out-of-tree build
-+#
-+# Generate the list of CONFIGs and values.
-+# $(value config) is the name of the CONFIG option.
-+# $(value $(value config)) is its value (y, m).
-+# When the CONFIG is not set to y or m, it defaults to n.
-+MAKE_ARGS := $(foreach config,$(CONFIGS), \
-+                    $(if $(filter y m,$(value $(value config))), \
-+                        $(value config)=$(value $(value config)), \
-+                        $(value config)=n))
-+
-+#
-+# EXTRA_CFLAGS to define the custom CONFIGs on out-of-tree build
-+#
-+# Generate the list of CONFIGs defines with values from CONFIGS.
-+# $(value config) is the name of the CONFIG option.
-+# When set to y or m, the CONFIG gets defined to 1.
-+EXTRA_CFLAGS := $(foreach config,$(CONFIGS), \
-+                    $(if $(filter y m,$(value $(value config))), \
-+                        -D$(value config)=1))
-+
-+all:
-+	$(MAKE) -C $(KDIR) M=$(CURDIR) $(MAKE_ARGS) EXTRA_CFLAGS="$(EXTRA_CFLAGS)" KBUILD_EXTRA_SYMBOLS="$(EXTRA_SYMBOLS)" modules
-+
-+modules_install:
-+	$(MAKE) -C $(KDIR) M=$(CURDIR) $(MAKE_ARGS) modules_install
-+
-+clean:
-+	$(MAKE) -C $(KDIR) M=$(CURDIR) $(MAKE_ARGS) clean
-diff --git a/dvalin/kernel/drivers/base/arm/Mconfig b/dvalin/kernel/drivers/base/arm/Mconfig
-new file mode 100644
-index 0000000..d21a72e
---- /dev/null
-+++ b/dvalin/kernel/drivers/base/arm/Mconfig
-@@ -0,0 +1,64 @@
-+# SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note
-+#
-+# (C) COPYRIGHT 2021 ARM Limited. All rights reserved.
-+#
-+# This program is free software and is provided to you under the terms of the
-+# GNU General Public License version 2 as published by the Free Software
-+# Foundation, and any use by you of this program is subject to the terms
-+# of such GNU license.
-+#
-+# This program is distributed in the hope that it will be useful,
-+# but WITHOUT ANY WARRANTY; without even the implied warranty of
-+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-+# GNU General Public License for more details.
-+#
-+# You should have received a copy of the GNU General Public License
-+# along with this program; if not, you can access it online at
-+# http://www.gnu.org/licenses/gpl-2.0.html.
-+#
-+#
-+
-+menuconfig MALI_BASE_MODULES
-+	bool "Mali Base extra modules"
-+	default y if BACKEND_KERNEL
-+	help
-+	  Enable this option to build support for a Arm Mali base modules.
-+	  Those modules provide extra features or debug interfaces and,
-+	  are optional for the use of the Mali GPU modules.
-+
-+config DMA_SHARED_BUFFER_TEST_EXPORTER
-+	bool "Build dma-buf framework test exporter module"
-+	depends on MALI_BASE_MODULES
-+	default y
-+	help
-+	  This option will build the dma-buf framework test exporter module.
-+	  Usable to help test importers.
-+
-+	  Modules:
-+	    - dma-buf-test-exporter.ko
-+
-+config MALI_MEMORY_GROUP_MANAGER
-+	bool "Build Mali Memory Group Manager module"
-+	depends on MALI_BASE_MODULES
-+	default y
-+	help
-+	  This option will build the memory group manager module.
-+	  This is an example implementation for allocation and release of pages
-+	  for memory pools managed by Mali GPU device drivers.
-+
-+	  Modules:
-+	    - memory_group_manager.ko
-+
-+config MALI_PROTECTED_MEMORY_ALLOCATOR
-+	bool "Build Mali Protected Memory Allocator module"
-+	depends on MALI_BASE_MODULES && GPU_HAS_CSF
-+	default y
-+	help
-+	  This option will build the protected memory allocator module.
-+	  This is an example implementation for allocation and release of pages
-+	  of secure memory intended to be used by the firmware
-+	  of Mali GPU device drivers.
-+
-+	  Modules:
-+	    - protected_memory_allocator.ko
-+
-diff --git a/dvalin/kernel/drivers/base/dma_buf_lock/src/Kbuild b/dvalin/kernel/drivers/base/arm/dma_buf_lock/src/Kbuild
-similarity index 78%
-rename from dvalin/kernel/drivers/base/dma_buf_lock/src/Kbuild
-rename to dvalin/kernel/drivers/base/arm/dma_buf_lock/src/Kbuild
-index ddf1bb5..c7ae332 100644
---- a/dvalin/kernel/drivers/base/dma_buf_lock/src/Kbuild
-+++ b/dvalin/kernel/drivers/base/arm/dma_buf_lock/src/Kbuild
-@@ -1,10 +1,11 @@
-+# SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note
- #
--# (C) COPYRIGHT 2012 ARM Limited. All rights reserved.
-+# (C) COPYRIGHT 2012, 2020-2021 ARM Limited. All rights reserved.
- #
- # This program is free software and is provided to you under the terms of the
- # GNU General Public License version 2 as published by the Free Software
- # Foundation, and any use by you of this program is subject to the terms
--# of such GNU licence.
-+# of such GNU license.
- #
- # This program is distributed in the hope that it will be useful,
- # but WITHOUT ANY WARRANTY; without even the implied warranty of
-@@ -15,10 +16,8 @@
- # along with this program; if not, you can access it online at
- # http://www.gnu.org/licenses/gpl-2.0.html.
- #
--# SPDX-License-Identifier: GPL-2.0
--#
- #
- 
--ifneq ($(CONFIG_DMA_SHARED_BUFFER),)
-+ifeq ($(CONFIG_DMA_SHARED_BUFFER), y)
- obj-m := dma_buf_lock.o
- endif
-diff --git a/dvalin/kernel/drivers/base/dma_buf_lock/src/Makefile b/dvalin/kernel/drivers/base/arm/dma_buf_lock/src/Makefile
-similarity index 71%
-rename from dvalin/kernel/drivers/base/dma_buf_lock/src/Makefile
-rename to dvalin/kernel/drivers/base/arm/dma_buf_lock/src/Makefile
-index 3b10406..451d2d7 100644
---- a/dvalin/kernel/drivers/base/dma_buf_lock/src/Makefile
-+++ b/dvalin/kernel/drivers/base/arm/dma_buf_lock/src/Makefile
-@@ -1,10 +1,11 @@
-+# SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note
- #
--# (C) COPYRIGHT 2012 ARM Limited. All rights reserved.
-+# (C) COPYRIGHT 2012, 2020-2021 ARM Limited. All rights reserved.
- #
- # This program is free software and is provided to you under the terms of the
- # GNU General Public License version 2 as published by the Free Software
- # Foundation, and any use by you of this program is subject to the terms
--# of such GNU licence.
-+# of such GNU license.
- #
- # This program is distributed in the hope that it will be useful,
- # but WITHOUT ANY WARRANTY; without even the implied warranty of
-@@ -15,8 +16,6 @@
- # along with this program; if not, you can access it online at
- # http://www.gnu.org/licenses/gpl-2.0.html.
- #
--# SPDX-License-Identifier: GPL-2.0
--#
- #
- 
- # linux build system bootstrap for out-of-tree module
-@@ -24,15 +23,17 @@
- # default to building for the host
- ARCH ?= $(shell uname -m)
- 
--ifeq ($(KDIR),)
--$(error Must specify KDIR to point to the kernel to target))
--endif
-+# Handle Android Common Kernel source naming
-+KERNEL_SRC ?= /lib/modules/$(shell uname -r)/build
-+KDIR ?= $(KERNEL_SRC)
- 
- all: dma_buf_lock
- 
- dma_buf_lock:
--	$(MAKE) ARCH=$(ARCH) -C $(KDIR) M=$(CURDIR) EXTRA_CFLAGS="-I$(CURDIR)/../../../../include"
-+	$(MAKE) ARCH=$(ARCH) -C $(KDIR) M=$(CURDIR) EXTRA_CFLAGS="-I$(CURDIR)/../../../../../include"
- 
- clean:
- 	$(MAKE) ARCH=$(ARCH) -C $(KDIR) M=$(CURDIR) clean
- 
-+modules_install:
-+	$(MAKE) ARCH=$(ARCH) -C $(KDIR) M=$(CURDIR) modules_install
-diff --git a/dvalin/kernel/drivers/base/dma_buf_lock/src/dma_buf_lock.c b/dvalin/kernel/drivers/base/arm/dma_buf_lock/src/dma_buf_lock.c
-similarity index 90%
-rename from dvalin/kernel/drivers/base/dma_buf_lock/src/dma_buf_lock.c
-rename to dvalin/kernel/drivers/base/arm/dma_buf_lock/src/dma_buf_lock.c
-index 529ce71..f5ab1ed 100644
---- a/dvalin/kernel/drivers/base/dma_buf_lock/src/dma_buf_lock.c
-+++ b/dvalin/kernel/drivers/base/arm/dma_buf_lock/src/dma_buf_lock.c
-@@ -1,11 +1,12 @@
-+// SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note
- /*
-  *
-- * (C) COPYRIGHT 2012-2013, 2017-2018 ARM Limited. All rights reserved.
-+ * (C) COPYRIGHT 2012-2014, 2017-2018, 2020-2021 ARM Limited. All rights reserved.
-  *
-  * This program is free software and is provided to you under the terms of the
-  * GNU General Public License version 2 as published by the Free Software
-  * Foundation, and any use by you of this program is subject to the terms
-- * of such GNU licence.
-+ * of such GNU license.
-  *
-  * This program is distributed in the hope that it will be useful,
-  * but WITHOUT ANY WARRANTY; without even the implied warranty of
-@@ -16,8 +17,6 @@
-  * along with this program; if not, you can access it online at
-  * http://www.gnu.org/licenses/gpl-2.0.html.
-  *
-- * SPDX-License-Identifier: GPL-2.0
-- *
-  */
- 
- #include <linux/version.h>
-@@ -29,7 +28,11 @@
- #include <linux/device.h>
- #include <linux/slab.h>
- #include <linux/atomic.h>
-+#if (KERNEL_VERSION(5, 4, 0) > LINUX_VERSION_CODE)
- #include <linux/reservation.h>
-+#else
-+#include <linux/dma-resv.h>
-+#endif
- #include <linux/dma-buf.h>
- #include <linux/wait.h>
- #include <linux/sched.h>
-@@ -37,7 +40,7 @@
- #include <linux/anon_inodes.h>
- #include <linux/file.h>
- 
--#if (LINUX_VERSION_CODE < KERNEL_VERSION(4, 10, 0))
-+#if (KERNEL_VERSION(4, 10, 0) > LINUX_VERSION_CODE)
- 
- #include <linux/fence.h>
- 
-@@ -60,7 +63,7 @@
- 
- #include <linux/dma-fence.h>
- 
--#if (LINUX_VERSION_CODE < KERNEL_VERSION(4, 11, 0))
-+#if (KERNEL_VERSION(4, 11, 0) > LINUX_VERSION_CODE)
- #define dma_fence_get_status(a) (dma_fence_is_signaled(a) ? \
- 	(a)->status ?: 1 \
- 	: 0)
-@@ -101,7 +104,7 @@ static struct file_operations dma_buf_lock_fops =
- 
- typedef struct dma_buf_lock_resource
- {
--#if (LINUX_VERSION_CODE < KERNEL_VERSION(4, 10, 0))
-+#if (KERNEL_VERSION(4, 10, 0) > LINUX_VERSION_CODE)
- 	struct fence fence;
- #else
- 	struct dma_fence fence;
-@@ -127,7 +130,7 @@ typedef struct dma_buf_lock_resource
-  * @node:     List head for linking this callback to the lock resource
-  */
- struct dma_buf_lock_fence_cb {
--#if (LINUX_VERSION_CODE < KERNEL_VERSION(4, 10, 0))
-+#if (KERNEL_VERSION(4, 10, 0) > LINUX_VERSION_CODE)
- 	struct fence_cb fence_cb;
- 	struct fence *fence;
- #else
-@@ -151,7 +154,7 @@ static void dma_buf_lock_dounlock(struct kref *ref);
- static DEFINE_SPINLOCK(dma_buf_lock_fence_lock);
- 
- static const char *
--#if (LINUX_VERSION_CODE < KERNEL_VERSION(4, 10, 0))
-+#if (KERNEL_VERSION(4, 10, 0) > LINUX_VERSION_CODE)
- dma_buf_lock_fence_get_driver_name(struct fence *fence)
- #else
- dma_buf_lock_fence_get_driver_name(struct dma_fence *fence)
-@@ -161,7 +164,7 @@ dma_buf_lock_fence_get_driver_name(struct dma_fence *fence)
- }
- 
- static const char *
--#if (LINUX_VERSION_CODE < KERNEL_VERSION(4, 10, 0))
-+#if (KERNEL_VERSION(4, 10, 0) > LINUX_VERSION_CODE)
- dma_buf_lock_fence_get_timeline_name(struct fence *fence)
- #else
- dma_buf_lock_fence_get_timeline_name(struct dma_fence *fence)
-@@ -171,7 +174,7 @@ dma_buf_lock_fence_get_timeline_name(struct dma_fence *fence)
- }
- 
- static bool
--#if (LINUX_VERSION_CODE < KERNEL_VERSION(4, 10, 0))
-+#if (KERNEL_VERSION(4, 10, 0) > LINUX_VERSION_CODE)
- dma_buf_lock_fence_enable_signaling(struct fence *fence)
- #else
- dma_buf_lock_fence_enable_signaling(struct dma_fence *fence)
-@@ -180,7 +183,7 @@ dma_buf_lock_fence_enable_signaling(struct dma_fence *fence)
- 	return true;
- }
- 
--#if (LINUX_VERSION_CODE < KERNEL_VERSION(4, 10, 0))
-+#if (KERNEL_VERSION(4, 10, 0) > LINUX_VERSION_CODE)
- const struct fence_ops dma_buf_lock_fence_ops = {
- 	.wait = fence_default_wait,
- #else
-@@ -235,7 +238,7 @@ dma_buf_lock_fence_work(struct work_struct *pwork)
- }
- 
- static void
--#if (LINUX_VERSION_CODE < KERNEL_VERSION(4, 10, 0))
-+#if (KERNEL_VERSION(4, 10, 0) > LINUX_VERSION_CODE)
- dma_buf_lock_fence_callback(struct fence *fence, struct fence_cb *cb)
- #else
- dma_buf_lock_fence_callback(struct dma_fence *fence, struct dma_fence_cb *cb)
-@@ -256,14 +259,13 @@ dma_buf_lock_fence_callback(struct dma_fence *fence, struct dma_fence_cb *cb)
- 		atomic_set(&resource->locked, 1);
- 		wake_up(&resource->wait);
- 
--		if (resource->exclusive) {
-+		if (resource->exclusive)
- 			/* Warn if the work was already queued */
- 			WARN_ON(!schedule_work(&resource->work));
--		}
- 	}
- }
- 
--#if (LINUX_VERSION_CODE < KERNEL_VERSION(4, 10, 0))
-+#if (KERNEL_VERSION(4, 10, 0) > LINUX_VERSION_CODE)
- static int
- dma_buf_lock_fence_add_callback(dma_buf_lock_resource *resource,
- 				struct fence *fence,
-@@ -317,12 +319,19 @@ dma_buf_lock_fence_add_callback(dma_buf_lock_resource *resource,
- 	return err;
- }
- 
-+#if (KERNEL_VERSION(5, 4, 0) > LINUX_VERSION_CODE)
- static int
- dma_buf_lock_add_fence_reservation_callback(dma_buf_lock_resource *resource,
- 					    struct reservation_object *resv,
- 					    bool exclusive)
-+#else
-+static int
-+dma_buf_lock_add_fence_reservation_callback(dma_buf_lock_resource *resource,
-+					    struct dma_resv *resv,
-+					    bool exclusive)
-+#endif
- {
--#if (LINUX_VERSION_CODE < KERNEL_VERSION(4, 10, 0))
-+#if (KERNEL_VERSION(4, 10, 0) > LINUX_VERSION_CODE)
- 	struct fence *excl_fence = NULL;
- 	struct fence **shared_fences = NULL;
- #else
-@@ -332,7 +341,12 @@ dma_buf_lock_add_fence_reservation_callback(dma_buf_lock_resource *resource,
- 	unsigned int shared_count = 0;
- 	int err, i;
- 
--	err = reservation_object_get_fences_rcu(resv,
-+#if (KERNEL_VERSION(5, 4, 0) > LINUX_VERSION_CODE)
-+	err = reservation_object_get_fences_rcu(
-+#else
-+	err = dma_resv_get_fences_rcu(
-+#endif
-+						resv,
- 						&excl_fence,
- 						&shared_count,
- 						&shared_fences);
-@@ -393,7 +407,11 @@ static int
- dma_buf_lock_acquire_fence_reservation(dma_buf_lock_resource *resource,
- 				       struct ww_acquire_ctx *ctx)
- {
-+#if (KERNEL_VERSION(5, 4, 0) > LINUX_VERSION_CODE)
- 	struct reservation_object *content_resv = NULL;
-+#else
-+	struct dma_resv *content_resv = NULL;
-+#endif
- 	unsigned int content_resv_idx = 0;
- 	unsigned int r;
- 	int err = 0;
-@@ -472,21 +490,16 @@ static unsigned int dma_buf_lock_handle_poll(struct file *file,
- #if DMA_BUF_LOCK_DEBUG
- 	printk("dma_buf_lock_handle_poll\n");
- #endif
--	if (1 == atomic_read(&resource->locked))
--	{
-+	if (atomic_read(&resource->locked) == 1) {
- 		/* Resources have been locked */
- 		ret = POLLIN | POLLRDNORM;
- 		if (resource->exclusive)
--		{
- 			ret |=  POLLOUT | POLLWRNORM;
--		}
- 	}
- 	else
- 	{
--		if (!poll_does_not_wait(wait)) 
--		{
-+		if (!poll_does_not_wait(wait))
- 			poll_wait(file, &resource->wait, wait);
--		}
- 	}
- #if DMA_BUF_LOCK_DEBUG
- 	printk("dma_buf_lock_handle_poll : return %i\n", ret);
-@@ -525,29 +538,19 @@ static int dma_buf_lock_dolock(dma_buf_lock_k_request *request)
- 	int i;
- 	int ret;
- 
--	if (NULL == request->list_of_dma_buf_fds)
--	{
-+	if (request->list_of_dma_buf_fds == NULL)
- 		return -EINVAL;
--	}
- 	if (request->count <= 0)
--	{
- 		return -EINVAL;
--	}
- 	if (request->count > DMA_BUF_LOCK_BUF_MAX)
--	{
- 		return -EINVAL;
--	}
- 	if (request->exclusive != DMA_BUF_LOCK_NONEXCLUSIVE &&
- 	    request->exclusive != DMA_BUF_LOCK_EXCLUSIVE)
--	{
- 		return -EINVAL;
--	}
- 
- 	resource = kzalloc(sizeof(dma_buf_lock_resource), GFP_KERNEL);
--	if (NULL == resource)
--	{
-+	if (resource == NULL)
- 		return -ENOMEM;
--	}
- 
- 	atomic_set(&resource->locked, 0);
- 	kref_init(&resource->refcount);
-@@ -559,8 +562,7 @@ static int dma_buf_lock_dolock(dma_buf_lock_k_request *request)
- 	size = request->count * sizeof(int);
- 	resource->list_of_dma_buf_fds = kmalloc(size, GFP_KERNEL);
- 
--	if (NULL == resource->list_of_dma_buf_fds)
--	{
-+	if (resource->list_of_dma_buf_fds == NULL) {
- 		kfree(resource);
- 		return -ENOMEM;
- 	}
-@@ -569,8 +571,7 @@ static int dma_buf_lock_dolock(dma_buf_lock_k_request *request)
- 	size = sizeof(struct dma_buf *) * request->count;
- 	resource->dma_bufs = kmalloc(size, GFP_KERNEL);
- 
--	if (NULL == resource->dma_bufs)
--	{
-+	if (resource->dma_bufs == NULL) {
- 		kfree(resource->list_of_dma_buf_fds);
- 		kfree(resource);
- 		return -ENOMEM;
-@@ -578,8 +579,9 @@ static int dma_buf_lock_dolock(dma_buf_lock_k_request *request)
- 
- 	/* Copy requested list of dma_buf_fds from user space */
- 	size = request->count * sizeof(int);
--	if (0 != copy_from_user(resource->list_of_dma_buf_fds, (void __user *)request->list_of_dma_buf_fds, size))
--	{
-+	if (copy_from_user(resource->list_of_dma_buf_fds,
-+			   (void __user *)request->list_of_dma_buf_fds,
-+			   size) != 0) {
- 		kfree(resource->list_of_dma_buf_fds);
- 		kfree(resource->dma_bufs);
- 		kfree(resource);
-@@ -587,9 +589,7 @@ static int dma_buf_lock_dolock(dma_buf_lock_k_request *request)
- 	}
- #if DMA_BUF_LOCK_DEBUG
- 	for (i = 0; i < request->count; i++)
--	{
- 		printk("dma_buf %i = %X\n", i, resource->list_of_dma_buf_fds[i]);
--	}
- #endif
- 
- 	/* Initialize the fence associated with dma_buf_lock resource */
-@@ -620,8 +620,7 @@ static int dma_buf_lock_dolock(dma_buf_lock_k_request *request)
- 		}
- 
- 		/*Check the reservation object associated with dma_buf */
--		if (NULL == resource->dma_bufs[i]->resv)
--		{
-+		if (resource->dma_bufs[i]->resv == NULL) {
- 			mutex_lock(&dma_buf_lock_mutex);
- 			kref_put(&resource->refcount, dma_buf_lock_dounlock);
- 			mutex_unlock(&dma_buf_lock_mutex);
-@@ -680,10 +679,18 @@ static int dma_buf_lock_dolock(dma_buf_lock_k_request *request)
- 		kref_get(&resource->refcount);
- 
- 	for (i = 0; i < request->count; i++) {
-+#if (KERNEL_VERSION(5, 4, 0) > LINUX_VERSION_CODE)
- 		struct reservation_object *resv = resource->dma_bufs[i]->resv;
--
-+#else
-+		struct dma_resv *resv = resource->dma_bufs[i]->resv;
-+#endif
- 		if (!test_bit(i, &resource->exclusive)) {
-+
-+#if (KERNEL_VERSION(5, 4, 0) > LINUX_VERSION_CODE)
- 			ret = reservation_object_reserve_shared(resv);
-+#else
-+			ret = dma_resv_reserve_shared(resv, 0);
-+#endif
- 			if (ret) {
- #if DMA_BUF_LOCK_DEBUG
- 				printk(KERN_DEBUG "dma_buf_lock_dolock : Error %d reserving space for shared fence.\n", ret);
-@@ -701,7 +708,11 @@ static int dma_buf_lock_dolock(dma_buf_lock_k_request *request)
- 				break;
- 			}
- 
-+#if (KERNEL_VERSION(5, 4, 0) > LINUX_VERSION_CODE)
- 			reservation_object_add_shared_fence(resv, &resource->fence);
-+#else
-+			dma_resv_add_shared_fence(resv, &resource->fence);
-+#endif
- 		} else {
- 			ret = dma_buf_lock_add_fence_reservation_callback(resource,
- 									  resv,
-@@ -713,7 +724,11 @@ static int dma_buf_lock_dolock(dma_buf_lock_k_request *request)
- 				break;
- 			}
- 
-+#if (KERNEL_VERSION(5, 4, 0) > LINUX_VERSION_CODE)
- 			reservation_object_add_excl_fence(resv, &resource->fence);
-+#else
-+			dma_resv_add_excl_fence(resv, &resource->fence);
-+#endif
- 		}
- 	}
- 
-@@ -783,27 +798,21 @@ static int __init dma_buf_lock_init(void)
- #endif
- 	err = alloc_chrdev_region(&dma_buf_lock_dev, 0, 1, dma_buf_lock_dev_name);
- 
--	if (0 == err)
--	{
-+	if (err == 0) {
- 		cdev_init(&dma_buf_lock_cdev, &dma_buf_lock_fops);
- 
- 		err = cdev_add(&dma_buf_lock_cdev, dma_buf_lock_dev, 1);
- 
--		if (0 == err)
--		{
-+		if (err == 0) {
- 			dma_buf_lock_class = class_create(THIS_MODULE, dma_buf_lock_dev_name);
- 			if (IS_ERR(dma_buf_lock_class))
--			{
- 				err = PTR_ERR(dma_buf_lock_class);
--			}
- 			else
- 			{
- 				struct device *mdev;
- 				mdev = device_create(dma_buf_lock_class, NULL, dma_buf_lock_dev, NULL, dma_buf_lock_dev_name);
- 				if (!IS_ERR(mdev))
--				{
- 					return 0;
--				}
- 
- 				err = PTR_ERR(mdev);
- 				class_destroy(dma_buf_lock_class);
-@@ -836,7 +845,7 @@ static void __exit dma_buf_lock_exit(void)
- 		}
- 		else
- 		{
--			dma_buf_lock_resource *resource = list_entry(dma_buf_lock_resource_list.next, 
-+			dma_buf_lock_resource *resource = list_entry(dma_buf_lock_resource_list.next,
- 			                                             dma_buf_lock_resource, link);
- 			kref_put(&resource->refcount, dma_buf_lock_dounlock);
- 			mutex_unlock(&dma_buf_lock_mutex);
-@@ -862,26 +871,17 @@ static int dma_buf_lock_ioctl(struct inode *inode, struct file *filp, unsigned i
- 	int size = _IOC_SIZE(cmd);
- 
- 	if (_IOC_TYPE(cmd) != DMA_BUF_LOCK_IOC_MAGIC)
--	{
- 		return -ENOTTY;
--
--	}
- 	if ((_IOC_NR(cmd) < DMA_BUF_LOCK_IOC_MINNR) || (_IOC_NR(cmd) > DMA_BUF_LOCK_IOC_MAXNR))
--	{
- 		return -ENOTTY;
--	}
- 
- 	switch (cmd)
- 	{
- 		case DMA_BUF_LOCK_FUNC_LOCK_ASYNC:
- 			if (size != sizeof(dma_buf_lock_k_request))
--			{
- 				return -ENOTTY;
--			}
- 			if (copy_from_user(&request, (void __user *)arg, size))
--			{
- 				return -EFAULT;
--			}
- #if DMA_BUF_LOCK_DEBUG
- 			printk("DMA_BUF_LOCK_FUNC_LOCK_ASYNC - %i\n", request.count);
- #endif
-diff --git a/dvalin/kernel/drivers/base/dma_buf_lock/src/dma_buf_lock.h b/dvalin/kernel/drivers/base/arm/dma_buf_lock/src/dma_buf_lock.h
-similarity index 88%
-rename from dvalin/kernel/drivers/base/dma_buf_lock/src/dma_buf_lock.h
-rename to dvalin/kernel/drivers/base/arm/dma_buf_lock/src/dma_buf_lock.h
-index f2ae575..104af1f 100644
---- a/dvalin/kernel/drivers/base/dma_buf_lock/src/dma_buf_lock.h
-+++ b/dvalin/kernel/drivers/base/arm/dma_buf_lock/src/dma_buf_lock.h
-@@ -1,11 +1,12 @@
-+/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
- /*
-  *
-- * (C) COPYRIGHT 2012 ARM Limited. All rights reserved.
-+ * (C) COPYRIGHT 2012, 2020-2021 ARM Limited. All rights reserved.
-  *
-  * This program is free software and is provided to you under the terms of the
-  * GNU General Public License version 2 as published by the Free Software
-  * Foundation, and any use by you of this program is subject to the terms
-- * of such GNU licence.
-+ * of such GNU license.
-  *
-  * This program is distributed in the hope that it will be useful,
-  * but WITHOUT ANY WARRANTY; without even the implied warranty of
-@@ -16,8 +17,6 @@
-  * along with this program; if not, you can access it online at
-  * http://www.gnu.org/licenses/gpl-2.0.html.
-  *
-- * SPDX-License-Identifier: GPL-2.0
-- *
-  */
- 
- #ifndef _DMA_BUF_LOCK_H
-diff --git a/dvalin/kernel/drivers/base/arm/dma_buf_test_exporter/Kbuild b/dvalin/kernel/drivers/base/arm/dma_buf_test_exporter/Kbuild
-new file mode 100644
-index 0000000..0e20cb4
---- /dev/null
-+++ b/dvalin/kernel/drivers/base/arm/dma_buf_test_exporter/Kbuild
-@@ -0,0 +1,23 @@
-+# SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note
-+#
-+# (C) COPYRIGHT 2012, 2020-2021 ARM Limited. All rights reserved.
-+#
-+# This program is free software and is provided to you under the terms of the
-+# GNU General Public License version 2 as published by the Free Software
-+# Foundation, and any use by you of this program is subject to the terms
-+# of such GNU license.
-+#
-+# This program is distributed in the hope that it will be useful,
-+# but WITHOUT ANY WARRANTY; without even the implied warranty of
-+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-+# GNU General Public License for more details.
-+#
-+# You should have received a copy of the GNU General Public License
-+# along with this program; if not, you can access it online at
-+# http://www.gnu.org/licenses/gpl-2.0.html.
-+#
-+#
-+
-+ifeq ($(CONFIG_DMA_SHARED_BUFFER_TEST_EXPORTER), y)
-+obj-m += dma-buf-test-exporter.o
-+endif
-diff --git a/dvalin/kernel/drivers/base/arm/dma_buf_test_exporter/build.bp b/dvalin/kernel/drivers/base/arm/dma_buf_test_exporter/build.bp
-new file mode 100644
-index 0000000..a49fb81
---- /dev/null
-+++ b/dvalin/kernel/drivers/base/arm/dma_buf_test_exporter/build.bp
-@@ -0,0 +1,36 @@
-+/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
-+/*
-+ *
-+ * (C) COPYRIGHT 2017, 2020-2021 ARM Limited. All rights reserved.
-+ *
-+ * This program is free software and is provided to you under the terms of the
-+ * GNU General Public License version 2 as published by the Free Software
-+ * Foundation, and any use by you of this program is subject to the terms
-+ * of such GNU license.
-+ *
-+ * This program is distributed in the hope that it will be useful,
-+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
-+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-+ * GNU General Public License for more details.
-+ *
-+ * You should have received a copy of the GNU General Public License
-+ * along with this program; if not, you can access it online at
-+ * http://www.gnu.org/licenses/gpl-2.0.html.
-+ *
-+ */
-+
-+bob_kernel_module {
-+    name: "dma-buf-test-exporter",
-+    defaults: [
-+        "kernel_defaults"
-+    ],
-+    srcs: [
-+        "Kbuild",
-+        "dma-buf-test-exporter.c",
-+    ],
-+    enabled: false,
-+    dma_shared_buffer_test_exporter: {
-+        kbuild_options: ["CONFIG_DMA_SHARED_BUFFER_TEST_EXPORTER=y"],
-+        enabled: true,
-+    },
-+}
-diff --git a/dvalin/kernel/drivers/base/dma_buf_test_exporter/dma-buf-test-exporter.c b/dvalin/kernel/drivers/base/arm/dma_buf_test_exporter/dma-buf-test-exporter.c
-similarity index 89%
-rename from dvalin/kernel/drivers/base/dma_buf_test_exporter/dma-buf-test-exporter.c
-rename to dvalin/kernel/drivers/base/arm/dma_buf_test_exporter/dma-buf-test-exporter.c
-index 3eb34c0..ccf73cc 100644
---- a/dvalin/kernel/drivers/base/dma_buf_test_exporter/dma-buf-test-exporter.c
-+++ b/dvalin/kernel/drivers/base/arm/dma_buf_test_exporter/dma-buf-test-exporter.c
-@@ -1,11 +1,12 @@
-+// SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note
- /*
-  *
-- * (C) COPYRIGHT 2012-2020 ARM Limited. All rights reserved.
-+ * (C) COPYRIGHT 2012-2021 ARM Limited. All rights reserved.
-  *
-  * This program is free software and is provided to you under the terms of the
-  * GNU General Public License version 2 as published by the Free Software
-  * Foundation, and any use by you of this program is subject to the terms
-- * of such GNU licence.
-+ * of such GNU license.
-  *
-  * This program is distributed in the hope that it will be useful,
-  * but WITHOUT ANY WARRANTY; without even the implied warranty of
-@@ -16,8 +17,6 @@
-  * along with this program; if not, you can access it online at
-  * http://www.gnu.org/licenses/gpl-2.0.html.
-  *
-- * SPDX-License-Identifier: GPL-2.0
-- *
-  */
- 
- #include <linux/dma-buf-test-exporter.h>
-@@ -31,18 +30,16 @@
- #include <linux/atomic.h>
- #include <linux/mm.h>
- #include <linux/highmem.h>
--#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 5, 0))
--#if (LINUX_VERSION_CODE < KERNEL_VERSION(4, 8, 0))
-+#if (KERNEL_VERSION(4, 8, 0) > LINUX_VERSION_CODE)
- #include <linux/dma-attrs.h>
- #endif
- #include <linux/dma-mapping.h>
--#endif
- 
- /* Maximum size allowed in a single DMA_BUF_TE_ALLOC call */
- #define DMA_BUF_TE_ALLOC_MAX_SIZE ((8ull << 30) >> PAGE_SHIFT) /* 8 GB */
- 
- /* Since kernel version 5.0 CONFIG_ARCH_NO_SG_CHAIN replaced CONFIG_ARCH_HAS_SG_CHAIN */
--#if LINUX_VERSION_CODE < KERNEL_VERSION(5, 0, 0)
-+#if KERNEL_VERSION(5, 0, 0) > LINUX_VERSION_CODE
- #if (!defined(ARCH_HAS_SG_CHAIN) && !defined(CONFIG_ARCH_HAS_SG_CHAIN))
- #define NO_SG_CHAIN
- #endif
-@@ -77,7 +74,7 @@ struct dma_buf_te_attachment {
- 
- static struct miscdevice te_device;
- 
--#if (LINUX_VERSION_CODE < KERNEL_VERSION(4, 19, 0))
-+#if (KERNEL_VERSION(4, 19, 0) > LINUX_VERSION_CODE)
- static int dma_buf_te_attach(struct dma_buf *buf, struct device *dev, struct dma_buf_attachment *attachment)
- #else
- static int dma_buf_te_attach(struct dma_buf *buf, struct dma_buf_attachment *attachment)
-@@ -206,30 +203,29 @@ static void dma_buf_te_release(struct dma_buf *buf)
- 	/* no need for locking */
- 
- 	if (alloc->contiguous) {
--#if (LINUX_VERSION_CODE >= KERNEL_VERSION(4, 8, 0))
-+#if (KERNEL_VERSION(4, 8, 0) <= LINUX_VERSION_CODE)
- 		dma_free_attrs(te_device.this_device,
- 						alloc->nr_pages * PAGE_SIZE,
- 						alloc->contig_cpu_addr,
- 						alloc->contig_dma_addr,
- 						DMA_ATTR_WRITE_COMBINE);
--
--#elif (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 5, 0))
-+#else
- 		DEFINE_DMA_ATTRS(attrs);
- 
- 		dma_set_attr(DMA_ATTR_WRITE_COMBINE, &attrs);
- 		dma_free_attrs(te_device.this_device,
- 						alloc->nr_pages * PAGE_SIZE,
- 						alloc->contig_cpu_addr, alloc->contig_dma_addr, &attrs);
--#else
--		dma_free_writecombine(te_device.this_device,
--								alloc->nr_pages * PAGE_SIZE,
--								alloc->contig_cpu_addr, alloc->contig_dma_addr);
- #endif
- 	} else {
- 		for (i = 0; i < alloc->nr_pages; i++)
- 			__free_page(alloc->pages[i]);
- 	}
-+#if (KERNEL_VERSION(4, 12, 0) <= LINUX_VERSION_CODE)
-+	kvfree(alloc->pages);
-+#else
- 	kfree(alloc->pages);
-+#endif
- 	kfree(alloc);
- }
- 
-@@ -316,7 +312,7 @@ static void dma_buf_te_mmap_close(struct vm_area_struct *vma)
- 	mutex_unlock(&dma_buf->lock);
- }
- 
--#if LINUX_VERSION_CODE < KERNEL_VERSION(4, 11, 0)
-+#if KERNEL_VERSION(4, 11, 0) > LINUX_VERSION_CODE
- static int dma_buf_te_mmap_fault(struct vm_area_struct *vma, struct vm_fault *vmf)
- #elif KERNEL_VERSION(5, 1, 0) > LINUX_VERSION_CODE
- static int dma_buf_te_mmap_fault(struct vm_fault *vmf)
-@@ -328,7 +324,7 @@ static vm_fault_t dma_buf_te_mmap_fault(struct vm_fault *vmf)
- 	struct dma_buf *dmabuf;
- 	struct page *pageptr;
- 
--#if LINUX_VERSION_CODE < KERNEL_VERSION(4, 11, 0)
-+#if KERNEL_VERSION(4, 11, 0) > LINUX_VERSION_CODE
- 	dmabuf = vma->vm_private_data;
- #else
- 	dmabuf = vmf->vma->vm_private_data;
-@@ -362,11 +358,7 @@ static int dma_buf_te_mmap(struct dma_buf *dmabuf, struct vm_area_struct *vma)
- 	if (alloc->fail_mmap)
- 		return -ENOMEM;
- 
--#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 7, 0))
- 	vma->vm_flags |= VM_IO | VM_DONTEXPAND | VM_DONTDUMP;
--#else
--	vma->vm_flags |= VM_RESERVED | VM_IO | VM_DONTEXPAND;
--#endif
- 	vma->vm_ops = &dma_buf_te_vm_ops;
- 	vma->vm_private_data = dmabuf;
- 
-@@ -378,7 +370,7 @@ static int dma_buf_te_mmap(struct dma_buf *dmabuf, struct vm_area_struct *vma)
- 	return 0;
- }
- 
--#if LINUX_VERSION_CODE < KERNEL_VERSION(4, 19, 0)
-+#if KERNEL_VERSION(4, 19, 0) > LINUX_VERSION_CODE
- static void *dma_buf_te_kmap_atomic(struct dma_buf *buf, unsigned long page_num)
- {
- 	/* IGNORE */
-@@ -419,19 +411,19 @@ static struct dma_buf_ops dma_buf_te_ops = {
- 	.mmap = dma_buf_te_mmap,
- 	.begin_cpu_access = dma_buf_te_begin_cpu_access,
- 	.end_cpu_access = dma_buf_te_end_cpu_access,
--#if LINUX_VERSION_CODE < KERNEL_VERSION(4, 12, 0)
-+#if KERNEL_VERSION(4, 12, 0) > LINUX_VERSION_CODE
- 	.kmap = dma_buf_te_kmap,
- 	.kunmap = dma_buf_te_kunmap,
- 
- 	/* nop handlers for mandatory functions we ignore */
- 	.kmap_atomic = dma_buf_te_kmap_atomic
- #else
--#if LINUX_VERSION_CODE < KERNEL_VERSION(5, 6, 0)
-+#if KERNEL_VERSION(5, 6, 0) > LINUX_VERSION_CODE
- 	.map = dma_buf_te_kmap,
- 	.unmap = dma_buf_te_kunmap,
- #endif
- 
--#if LINUX_VERSION_CODE < KERNEL_VERSION(4, 19, 0)
-+#if KERNEL_VERSION(4, 19, 0) > LINUX_VERSION_CODE
- 	/* nop handlers for mandatory functions we ignore */
- 	.map_atomic = dma_buf_te_kmap_atomic
- #endif
-@@ -481,7 +473,8 @@ static int do_dma_buf_te_ioctl_alloc(struct dma_buf_te_ioctl_alloc __user *buf,
- 	/* Whilst it is possible to allocate larger buffer, we won't be able to
- 	 * map it during actual usage (mmap() still succeeds). We fail here so
- 	 * userspace code can deal with it early than having driver failure
--	 * later on. */
-+	 * later on.
-+	 */
- 	if (max_nr_pages > SG_MAX_SINGLE_ALLOC)
- 		max_nr_pages = SG_MAX_SINGLE_ALLOC;
- #endif /* NO_SG_CHAIN */
-@@ -493,7 +486,7 @@ static int do_dma_buf_te_ioctl_alloc(struct dma_buf_te_ioctl_alloc __user *buf,
- 	}
- 
- 	alloc = kzalloc(sizeof(struct dma_buf_te_alloc), GFP_KERNEL);
--	if (NULL == alloc) {
-+	if (alloc == NULL) {
- 		dev_err(te_device.this_device, "%s: couldn't alloc object", __func__);
- 		goto no_alloc_object;
- 	}
-@@ -501,7 +494,12 @@ static int do_dma_buf_te_ioctl_alloc(struct dma_buf_te_ioctl_alloc __user *buf,
- 	alloc->nr_pages = alloc_req.size;
- 	alloc->contiguous = contiguous;
- 
-+#if (KERNEL_VERSION(4, 12, 0) <= LINUX_VERSION_CODE)
-+	alloc->pages = kvzalloc(sizeof(struct page *) * alloc->nr_pages, GFP_KERNEL);
-+#else
- 	alloc->pages = kzalloc(sizeof(struct page *) * alloc->nr_pages, GFP_KERNEL);
-+#endif
-+
- 	if (!alloc->pages) {
- 		dev_err(te_device.this_device,
- 				"%s: couldn't alloc %zu page structures",
-@@ -512,14 +510,13 @@ static int do_dma_buf_te_ioctl_alloc(struct dma_buf_te_ioctl_alloc __user *buf,
- 	if (contiguous) {
- 		dma_addr_t dma_aux;
- 
--#if (LINUX_VERSION_CODE >= KERNEL_VERSION(4, 8, 0))
-+#if (KERNEL_VERSION(4, 8, 0) <= LINUX_VERSION_CODE)
- 		alloc->contig_cpu_addr = dma_alloc_attrs(te_device.this_device,
- 				alloc->nr_pages * PAGE_SIZE,
- 				&alloc->contig_dma_addr,
- 				GFP_KERNEL | __GFP_ZERO,
- 				DMA_ATTR_WRITE_COMBINE);
--
--#elif (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 5, 0))
-+#else
- 		DEFINE_DMA_ATTRS(attrs);
- 
- 		dma_set_attr(DMA_ATTR_WRITE_COMBINE, &attrs);
-@@ -527,11 +524,6 @@ static int do_dma_buf_te_ioctl_alloc(struct dma_buf_te_ioctl_alloc __user *buf,
- 				alloc->nr_pages * PAGE_SIZE,
- 				&alloc->contig_dma_addr,
- 				GFP_KERNEL | __GFP_ZERO, &attrs);
--#else
--		alloc->contig_cpu_addr = dma_alloc_writecombine(te_device.this_device,
--				alloc->nr_pages * PAGE_SIZE,
--				&alloc->contig_dma_addr,
--				GFP_KERNEL | __GFP_ZERO);
- #endif
- 		if (!alloc->contig_cpu_addr) {
- 			dev_err(te_device.this_device, "%s: couldn't alloc contiguous buffer %zu pages",
-@@ -546,7 +538,7 @@ static int do_dma_buf_te_ioctl_alloc(struct dma_buf_te_ioctl_alloc __user *buf,
- 	} else {
- 		for (i = 0; i < alloc->nr_pages; i++) {
- 			alloc->pages[i] = alloc_page(GFP_KERNEL | __GFP_ZERO);
--			if (NULL == alloc->pages[i]) {
-+			if (alloc->pages[i] == NULL) {
- 				dev_err(te_device.this_device, "%s: couldn't alloc page", __func__);
- 				goto no_page;
- 			}
-@@ -554,13 +546,10 @@ static int do_dma_buf_te_ioctl_alloc(struct dma_buf_te_ioctl_alloc __user *buf,
- 	}
- 
- 	/* alloc ready, let's export it */
--#if (LINUX_VERSION_CODE >= KERNEL_VERSION(4, 1, 0))
- 	{
- 		struct dma_buf_export_info export_info = {
- 			.exp_name = "dma_buf_te",
--#if (LINUX_VERSION_CODE >= KERNEL_VERSION(4, 2, 0))
- 			.owner = THIS_MODULE,
--#endif
- 			.ops = &dma_buf_te_ops,
- 			.size = alloc->nr_pages << PAGE_SHIFT,
- 			.flags = O_CLOEXEC | O_RDWR,
-@@ -569,13 +558,6 @@ static int do_dma_buf_te_ioctl_alloc(struct dma_buf_te_ioctl_alloc __user *buf,
- 
- 		dma_buf = dma_buf_export(&export_info);
- 	}
--#elif (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 17, 0))
--	dma_buf = dma_buf_export(alloc, &dma_buf_te_ops,
--			alloc->nr_pages << PAGE_SHIFT, O_CLOEXEC|O_RDWR, NULL);
--#else
--	dma_buf = dma_buf_export(alloc, &dma_buf_te_ops,
--			alloc->nr_pages << PAGE_SHIFT, O_CLOEXEC|O_RDWR);
--#endif
- 
- 	if (IS_ERR_OR_NULL(dma_buf)) {
- 		dev_err(te_device.this_device, "%s: couldn't export dma_buf", __func__);
-@@ -598,32 +580,30 @@ no_export:
- 	/* i still valid */
- no_page:
- 	if (contiguous) {
--
--#if (LINUX_VERSION_CODE >= KERNEL_VERSION(4, 8, 0))
-+#if (KERNEL_VERSION(4, 8, 0) <= LINUX_VERSION_CODE)
- 		dma_free_attrs(te_device.this_device,
- 						alloc->nr_pages * PAGE_SIZE,
- 						alloc->contig_cpu_addr,
- 						alloc->contig_dma_addr,
- 						DMA_ATTR_WRITE_COMBINE);
--
--#elif (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 5, 0))
-+#else
- 		DEFINE_DMA_ATTRS(attrs);
- 
- 		dma_set_attr(DMA_ATTR_WRITE_COMBINE, &attrs);
- 		dma_free_attrs(te_device.this_device,
- 						alloc->nr_pages * PAGE_SIZE,
- 						alloc->contig_cpu_addr, alloc->contig_dma_addr, &attrs);
--#else
--		dma_free_writecombine(te_device.this_device,
--								alloc->nr_pages * PAGE_SIZE,
--								alloc->contig_cpu_addr, alloc->contig_dma_addr);
- #endif
- 	} else {
- 		while (i-- > 0)
- 			__free_page(alloc->pages[i]);
- 	}
- free_page_struct:
-+#if (KERNEL_VERSION(4, 12, 0) <= LINUX_VERSION_CODE)
-+	kvfree(alloc->pages);
-+#else
- 	kfree(alloc->pages);
-+#endif
- free_alloc_object:
- 	kfree(alloc);
- no_alloc_object:
-@@ -727,17 +707,17 @@ static u32 dma_te_buf_fill(struct dma_buf *dma_buf, unsigned int value)
- 	}
- 
- 	ret = dma_buf_begin_cpu_access(dma_buf,
--#if LINUX_VERSION_CODE < KERNEL_VERSION(4, 6, 0)
--			0, dma_buf->size,
-+#if KERNEL_VERSION(4, 6, 0) > LINUX_VERSION_CODE
-+				       0, dma_buf->size,
- #endif
--			DMA_BIDIRECTIONAL);
-+				       DMA_BIDIRECTIONAL);
- 	if (ret)
- 		goto no_cpu_access;
- 
- 	for_each_sg(sgt->sgl, sg, sgt->nents, count) {
- 		for (i = 0; i < sg_dma_len(sg); i = i + PAGE_SIZE) {
- 			void *addr = NULL;
--#if LINUX_VERSION_CODE >= KERNEL_VERSION(5, 6, 0)
-+#if KERNEL_VERSION(5, 6, 0) <= LINUX_VERSION_CODE
- 			addr = dma_buf_te_kmap(dma_buf, i >> PAGE_SHIFT);
- #else
- 			addr = dma_buf_kmap(dma_buf, i >> PAGE_SHIFT);
-@@ -747,7 +727,7 @@ static u32 dma_te_buf_fill(struct dma_buf *dma_buf, unsigned int value)
- 				goto no_kmap;
- 			}
- 			memset(addr, value, PAGE_SIZE);
--#if LINUX_VERSION_CODE >= KERNEL_VERSION(5, 6, 0)
-+#if KERNEL_VERSION(5, 6, 0) <= LINUX_VERSION_CODE
- 			dma_buf_te_kunmap(dma_buf, i >> PAGE_SHIFT, addr);
- #else
- 			dma_buf_kunmap(dma_buf, i >> PAGE_SHIFT, addr);
-@@ -758,10 +738,10 @@ static u32 dma_te_buf_fill(struct dma_buf *dma_buf, unsigned int value)
- 
- no_kmap:
- 	dma_buf_end_cpu_access(dma_buf,
--#if LINUX_VERSION_CODE < KERNEL_VERSION(4, 6, 0)
--			0, dma_buf->size,
-+#if KERNEL_VERSION(4, 6, 0) > LINUX_VERSION_CODE
-+			       0, dma_buf->size,
- #endif
--			DMA_BIDIRECTIONAL);
-+			       DMA_BIDIRECTIONAL);
- no_cpu_access:
- 	dma_buf_unmap_attachment(attachment, sgt, DMA_BIDIRECTIONAL);
- no_import:
-diff --git a/dvalin/kernel/drivers/base/dma_buf_test_exporter/Kbuild b/dvalin/kernel/drivers/base/arm/memory_group_manager/Kbuild
-similarity index 74%
-rename from dvalin/kernel/drivers/base/dma_buf_test_exporter/Kbuild
-rename to dvalin/kernel/drivers/base/arm/memory_group_manager/Kbuild
-index c382b79..99ce311 100644
---- a/dvalin/kernel/drivers/base/dma_buf_test_exporter/Kbuild
-+++ b/dvalin/kernel/drivers/base/arm/memory_group_manager/Kbuild
-@@ -1,10 +1,11 @@
-+# SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note
- #
--# (C) COPYRIGHT 2012 ARM Limited. All rights reserved.
-+# (C) COPYRIGHT 2019-2021 ARM Limited. All rights reserved.
- #
- # This program is free software and is provided to you under the terms of the
- # GNU General Public License version 2 as published by the Free Software
- # Foundation, and any use by you of this program is subject to the terms
--# of such GNU licence.
-+# of such GNU license.
- #
- # This program is distributed in the hope that it will be useful,
- # but WITHOUT ANY WARRANTY; without even the implied warranty of
-@@ -15,10 +16,8 @@
- # along with this program; if not, you can access it online at
- # http://www.gnu.org/licenses/gpl-2.0.html.
- #
--# SPDX-License-Identifier: GPL-2.0
--#
- #
- 
--ifneq ($(CONFIG_DMA_SHARED_BUFFER),)
--obj-$(CONFIG_DMA_SHARED_BUFFER_TEST_EXPORTER) += dma-buf-test-exporter.o
-+ifeq ($(CONFIG_MALI_MEMORY_GROUP_MANAGER), y)
-+obj-m := memory_group_manager.o
- endif
-diff --git a/dvalin/kernel/drivers/base/arm/memory_group_manager/build.bp b/dvalin/kernel/drivers/base/arm/memory_group_manager/build.bp
-new file mode 100644
-index 0000000..23db183
---- /dev/null
-+++ b/dvalin/kernel/drivers/base/arm/memory_group_manager/build.bp
-@@ -0,0 +1,36 @@
-+/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
-+/*
-+ *
-+ * (C) COPYRIGHT 2019-2021 ARM Limited. All rights reserved.
-+ *
-+ * This program is free software and is provided to you under the terms of the
-+ * GNU General Public License version 2 as published by the Free Software
-+ * Foundation, and any use by you of this program is subject to the terms
-+ * of such GNU license.
-+ *
-+ * This program is distributed in the hope that it will be useful,
-+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
-+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-+ * GNU General Public License for more details.
-+ *
-+ * You should have received a copy of the GNU General Public License
-+ * along with this program; if not, you can access it online at
-+ * http://www.gnu.org/licenses/gpl-2.0.html.
-+ *
-+ */
-+
-+bob_kernel_module {
-+    name: "memory_group_manager",
-+    defaults: [
-+        "kernel_defaults"
-+    ],
-+    srcs: [
-+        "Kbuild",
-+        "memory_group_manager.c",
-+    ],
-+    enabled: false,
-+    mali_memory_group_manager: {
-+        kbuild_options: ["CONFIG_MALI_MEMORY_GROUP_MANAGER=y"],
-+        enabled: true,
-+    },
-+}
-diff --git a/dvalin/kernel/drivers/base/memory_group_manager/memory_group_manager.c b/dvalin/kernel/drivers/base/arm/memory_group_manager/memory_group_manager.c
-similarity index 98%
-rename from dvalin/kernel/drivers/base/memory_group_manager/memory_group_manager.c
-rename to dvalin/kernel/drivers/base/arm/memory_group_manager/memory_group_manager.c
-index 44f848a..a70fe70 100644
---- a/dvalin/kernel/drivers/base/memory_group_manager/memory_group_manager.c
-+++ b/dvalin/kernel/drivers/base/arm/memory_group_manager/memory_group_manager.c
-@@ -1,11 +1,12 @@
-+// SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note
- /*
-  *
-- * (C) COPYRIGHT 2019 ARM Limited. All rights reserved.
-+ * (C) COPYRIGHT 2019-2021 ARM Limited. All rights reserved.
-  *
-  * This program is free software and is provided to you under the terms of the
-  * GNU General Public License version 2 as published by the Free Software
-  * Foundation, and any use by you of this program is subject to the terms
-- * of such GNU licence.
-+ * of such GNU license.
-  *
-  * This program is distributed in the hope that it will be useful,
-  * but WITHOUT ANY WARRANTY; without even the implied warranty of
-@@ -16,8 +17,6 @@
-  * along with this program; if not, you can access it online at
-  * http://www.gnu.org/licenses/gpl-2.0.html.
-  *
-- * SPDX-License-Identifier: GPL-2.0
-- *
-  */
- 
- #include <linux/fs.h>
-@@ -26,7 +25,7 @@
- #include <linux/platform_device.h>
- #include <linux/version.h>
- #include <linux/module.h>
--#ifdef CONFIG_DEBUG_FS
-+#if IS_ENABLED(CONFIG_DEBUG_FS)
- #include <linux/debugfs.h>
- #endif
- #include <linux/mm.h>
-@@ -92,12 +91,12 @@ struct mgm_group {
- struct mgm_groups {
- 	struct mgm_group groups[MEMORY_GROUP_MANAGER_NR_GROUPS];
- 	struct device *dev;
--#ifdef CONFIG_DEBUG_FS
-+#if IS_ENABLED(CONFIG_DEBUG_FS)
- 	struct dentry *mgm_debugfs_root;
- #endif
- };
- 
--#ifdef CONFIG_DEBUG_FS
-+#if IS_ENABLED(CONFIG_DEBUG_FS)
- 
- static int mgm_size_get(void *data, u64 *val)
- {
-@@ -475,7 +474,6 @@ static struct platform_driver memory_group_manager_driver = {
- 	.remove = memory_group_manager_remove,
- 	.driver = {
- 		.name = "physical-memory-group-manager",
--		.owner = THIS_MODULE,
- 		.of_match_table = of_match_ptr(memory_group_manager_dt_ids),
- 		/*
- 		 * Prevent the mgm_dev from being unbound and freed, as other's
-diff --git a/dvalin/kernel/drivers/base/arm/protected_memory_allocator/Kbuild b/dvalin/kernel/drivers/base/arm/protected_memory_allocator/Kbuild
-new file mode 100644
-index 0000000..25295a9
---- /dev/null
-+++ b/dvalin/kernel/drivers/base/arm/protected_memory_allocator/Kbuild
-@@ -0,0 +1,23 @@
-+# SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note
-+#
-+# (C) COPYRIGHT 2019-2021 ARM Limited. All rights reserved.
-+#
-+# This program is free software and is provided to you under the terms of the
-+# GNU General Public License version 2 as published by the Free Software
-+# Foundation, and any use by you of this program is subject to the terms
-+# of such GNU license.
-+#
-+# This program is distributed in the hope that it will be useful,
-+# but WITHOUT ANY WARRANTY; without even the implied warranty of
-+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-+# GNU General Public License for more details.
-+#
-+# You should have received a copy of the GNU General Public License
-+# along with this program; if not, you can access it online at
-+# http://www.gnu.org/licenses/gpl-2.0.html.
-+#
-+#
-+
-+ifeq ($(CONFIG_MALI_PROTECTED_MEMORY_ALLOCATOR), y)
-+obj-m := protected_memory_allocator.o
-+endif
-diff --git a/dvalin/kernel/drivers/base/arm/protected_memory_allocator/build.bp b/dvalin/kernel/drivers/base/arm/protected_memory_allocator/build.bp
-new file mode 100644
-index 0000000..4c56154
---- /dev/null
-+++ b/dvalin/kernel/drivers/base/arm/protected_memory_allocator/build.bp
-@@ -0,0 +1,36 @@
-+/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
-+/*
-+ *
-+ * (C) COPYRIGHT 2019-2021 ARM Limited. All rights reserved.
-+ *
-+ * This program is free software and is provided to you under the terms of the
-+ * GNU General Public License version 2 as published by the Free Software
-+ * Foundation, and any use by you of this program is subject to the terms
-+ * of such GNU license.
-+ *
-+ * This program is distributed in the hope that it will be useful,
-+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
-+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-+ * GNU General Public License for more details.
-+ *
-+ * You should have received a copy of the GNU General Public License
-+ * along with this program; if not, you can access it online at
-+ * http://www.gnu.org/licenses/gpl-2.0.html.
-+ *
-+ */
-+
-+bob_kernel_module {
-+    name: "protected_memory_allocator",
-+    defaults: [
-+        "kernel_defaults"
-+    ],
-+    srcs: [
-+        "Kbuild",
-+        "protected_memory_allocator.c",
-+    ],
-+    enabled: false,
-+    mali_protected_memory_allocator: {
-+        kbuild_options: ["CONFIG_MALI_PROTECTED_MEMORY_ALLOCATOR=y"],
-+        enabled: true,
-+    },
-+}
-diff --git a/dvalin/kernel/drivers/base/arm/protected_memory_allocator/protected_memory_allocator.c b/dvalin/kernel/drivers/base/arm/protected_memory_allocator/protected_memory_allocator.c
-new file mode 100644
-index 0000000..6684210
---- /dev/null
-+++ b/dvalin/kernel/drivers/base/arm/protected_memory_allocator/protected_memory_allocator.c
-@@ -0,0 +1,551 @@
-+// SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note
-+/*
-+ *
-+ * (C) COPYRIGHT 2019-2021 ARM Limited. All rights reserved.
-+ *
-+ * This program is free software and is provided to you under the terms of the
-+ * GNU General Public License version 2 as published by the Free Software
-+ * Foundation, and any use by you of this program is subject to the terms
-+ * of such GNU license.
-+ *
-+ * This program is distributed in the hope that it will be useful,
-+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
-+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-+ * GNU General Public License for more details.
-+ *
-+ * You should have received a copy of the GNU General Public License
-+ * along with this program; if not, you can access it online at
-+ * http://www.gnu.org/licenses/gpl-2.0.html.
-+ *
-+ */
-+
-+#include <linux/version.h>
-+#include <linux/of.h>
-+#include <linux/of_reserved_mem.h>
-+#include <linux/platform_device.h>
-+#include <linux/module.h>
-+#include <linux/slab.h>
-+#include <linux/mm.h>
-+#include <linux/io.h>
-+#include <linux/protected_memory_allocator.h>
-+
-+/* Size of a bitfield element in bytes */
-+#define BITFIELD_ELEM_SIZE sizeof(u64)
-+
-+/* We can track whether or not 64 pages are currently allocated in a u64 */
-+#define PAGES_PER_BITFIELD_ELEM (BITFIELD_ELEM_SIZE * BITS_PER_BYTE)
-+
-+/* Order 6 (ie, 64) corresponds to the number of pages held in a bitfield */
-+#define ORDER_OF_PAGES_PER_BITFIELD_ELEM 6
-+
-+/**
-+ * struct simple_pma_device -	Simple implementation of a protected memory
-+ *				allocator device
-+ *
-+ * @pma_dev:			Protected memory allocator device pointer
-+ * @dev:  			Device pointer
-+ * @alloc_pages_bitfield_arr:	Status of all the physical memory pages within the
-+ *				protected memory region, one bit per page
-+ * @rmem_base:			Base address of the reserved memory region
-+ * @rmem_size:			Size of the reserved memory region, in pages
-+ * @num_free_pages:		Number of free pages in the memory region
-+ * @rmem_lock:			Lock to serialize the allocation and freeing of
-+ *				physical pages from the protected memory region
-+ */
-+struct simple_pma_device {
-+	struct protected_memory_allocator_device pma_dev;
-+	struct device *dev;
-+	u64 *allocated_pages_bitfield_arr;
-+	phys_addr_t rmem_base;
-+	size_t rmem_size;
-+	size_t num_free_pages;
-+	spinlock_t rmem_lock;
-+};
-+
-+/**
-+ * Number of elements in array 'allocated_pages_bitfield_arr'. If the number of
-+ * pages required does not divide exactly by PAGES_PER_BITFIELD_ELEM, adds an
-+ * extra page for the remainder.
-+ */
-+#define ALLOC_PAGES_BITFIELD_ARR_SIZE(num_pages) \
-+	((PAGES_PER_BITFIELD_ELEM * (0 != (num_pages % PAGES_PER_BITFIELD_ELEM)) + \
-+	num_pages) / PAGES_PER_BITFIELD_ELEM)
-+
-+/**
-+ * Allocate a power-of-two number of pages, N, where
-+ * 0 <= N <= ORDER_OF_PAGES_PER_BITFIELD_ELEM - 1.  ie, Up to 32 pages. The routine
-+ * fills-in a pma structure and sets the appropriate bits in the allocated-pages
-+ * bitfield array but assumes the caller has already determined that these are
-+ * already clear.
-+ *
-+ * This routine always works within only a single allocated-pages bitfield element.
-+ * It can be thought of as the 'small-granularity' allocator.
-+ */
-+static void small_granularity_alloc(struct simple_pma_device *const epma_dev,
-+				    size_t alloc_bitfield_idx, size_t start_bit,
-+				    size_t order,
-+				    struct protected_memory_allocation *pma)
-+{
-+	size_t i;
-+	size_t page_idx;
-+	u64 *bitfield;
-+	size_t alloc_pages_bitfield_size;
-+
-+	if (WARN_ON(!epma_dev) ||
-+	    WARN_ON(!pma))
-+		return;
-+
-+	WARN(epma_dev->rmem_size == 0, "%s: rmem_size is 0", __func__);
-+	alloc_pages_bitfield_size = ALLOC_PAGES_BITFIELD_ARR_SIZE(epma_dev->rmem_size);
-+
-+	WARN(alloc_bitfield_idx >= alloc_pages_bitfield_size,
-+	     "%s: idx>bf_size: %zu %zu", __FUNCTION__,
-+	     alloc_bitfield_idx, alloc_pages_bitfield_size);
-+
-+	WARN((start_bit + (1 << order)) > PAGES_PER_BITFIELD_ELEM,
-+	     "%s: start=%zu order=%zu ppbe=%zu",
-+	     __FUNCTION__, start_bit, order, PAGES_PER_BITFIELD_ELEM);
-+
-+	bitfield = &epma_dev->allocated_pages_bitfield_arr[alloc_bitfield_idx];
-+
-+	for (i = 0; i < (1 << order); i++) {
-+		/* Check the pages represented by this bit are actually free */
-+		WARN (*bitfield & (1ULL << (start_bit + i)),
-+		      "in %s: page not free: %zu %zu %.16llx %zu\n",
-+		      __FUNCTION__, i, order, *bitfield, alloc_pages_bitfield_size);
-+
-+		/* Mark the pages as now allocated */
-+		*bitfield |= (1ULL << (start_bit + i));
-+	}
-+
-+	/* Compute the page index */
-+	page_idx = (alloc_bitfield_idx * PAGES_PER_BITFIELD_ELEM) + start_bit;
-+
-+	/* Fill-in the allocation struct for the caller */
-+	pma->pa = epma_dev->rmem_base + (page_idx << PAGE_SHIFT);
-+	pma->order = order;
-+}
-+
-+/**
-+ * Allocate a power-of-two number of pages, N, where
-+ * N >= ORDER_OF_PAGES_PER_BITFIELD_ELEM. ie, 64 pages or more. The routine fills-in
-+ * a pma structure and sets the appropriate bits in the allocated-pages bitfield array
-+ * but assumes the caller has already determined that these are already clear.
-+ *
-+ * Unlike small_granularity_alloc, this routine can work with multiple 64-page groups,
-+ * ie multiple elements from the allocated-pages bitfield array. However, it always
-+ * works with complete sets of these 64-page groups. It can therefore be thought of
-+ * as the 'large-granularity' allocator.
-+ */
-+static void large_granularity_alloc(struct simple_pma_device *const epma_dev,
-+				    size_t start_alloc_bitfield_idx,
-+				    size_t order,
-+				    struct protected_memory_allocation *pma)
-+{
-+	size_t i;
-+	size_t num_pages_to_alloc = (size_t)1 << order;
-+	size_t num_bitfield_elements_needed = num_pages_to_alloc / PAGES_PER_BITFIELD_ELEM;
-+	size_t start_page_idx = start_alloc_bitfield_idx * PAGES_PER_BITFIELD_ELEM;
-+
-+	if (WARN_ON(!epma_dev) ||
-+	    WARN_ON(!pma))
-+		return;
-+
-+	/*
-+	 * Are there anough bitfield array elements (groups of 64 pages)
-+	 * between the start element and the end of the bitfield array
-+	 * to fulfill the request?
-+	 */
-+	WARN((start_alloc_bitfield_idx + order) >= ALLOC_PAGES_BITFIELD_ARR_SIZE(epma_dev->rmem_size),
-+	     "%s: start=%zu order=%zu ms=%zu",
-+	     __FUNCTION__, start_alloc_bitfield_idx, order, epma_dev->rmem_size);
-+
-+	for (i = 0; i < num_bitfield_elements_needed; i++) {
-+		u64 *bitfield = &epma_dev->allocated_pages_bitfield_arr[start_alloc_bitfield_idx + i];
-+
-+		/* We expect all pages that relate to this bitfield element to be free */
-+		WARN((*bitfield != 0),
-+		     "in %s: pages not free: i=%zu o=%zu bf=%.16llx\n",
-+		     __FUNCTION__, i, order, *bitfield);
-+
-+		/* Mark all the pages for this element as not free */
-+		*bitfield = ~0ULL;
-+	}
-+
-+	/* Fill-in the allocation struct for the caller */
-+	pma->pa = epma_dev->rmem_base + (start_page_idx  << PAGE_SHIFT);
-+	pma->order = order;
-+}
-+
-+static struct protected_memory_allocation *simple_pma_alloc_page(
-+	struct protected_memory_allocator_device *pma_dev, unsigned int order)
-+{
-+	struct simple_pma_device *const epma_dev =
-+		container_of(pma_dev, struct simple_pma_device, pma_dev);
-+	struct protected_memory_allocation *pma;
-+	size_t num_pages_to_alloc;
-+
-+	u64 *bitfields = epma_dev->allocated_pages_bitfield_arr;
-+	size_t i;
-+	size_t bit;
-+	size_t count;
-+
-+	dev_dbg(epma_dev->dev, "%s(pma_dev=%px, order=%u\n",
-+		__func__, (void *)pma_dev, order);
-+
-+	/* This is an example function that follows an extremely simple logic
-+	 * and is very likely to fail to allocate memory if put under stress.
-+	 *
-+	 * The simple_pma_device maintains an array of u64s, with one bit used
-+	 * to track the status of each page.
-+	 *
-+	 * In order to create a memory allocation, the allocator looks for an
-+	 * adjacent group of cleared bits. This does leave the algorithm open
-+	 * to fragmentation issues, but is deemed sufficient for now.
-+	 * If successful, the allocator shall mark all the pages as allocated
-+	 * and increment the offset accordingly.
-+	 *
-+	 * Allocations of 64 pages or more (order 6) can be allocated only with
-+	 * 64-page alignment, in order to keep the algorithm as simple as
-+	 * possible. ie, starting from bit 0 of any 64-bit page-allocation
-+	 * bitfield. For this, the large-granularity allocator is utilised.
-+	 *
-+	 * Allocations of lower-order can only be allocated entirely within the
-+	 * same group of 64 pages, with the small-ganularity allocator  (ie
-+	 * always from the same 64-bit page-allocation bitfield) - again, to
-+	 * keep things as simple as possible, but flexible to meet
-+	 * current needs.
-+	 */
-+
-+	num_pages_to_alloc = (size_t)1 << order;
-+
-+	pma = devm_kzalloc(epma_dev->dev, sizeof(*pma), GFP_KERNEL);
-+	if (!pma) {
-+		dev_err(epma_dev->dev, "Failed to alloc pma struct");
-+		return NULL;
-+	}
-+
-+	spin_lock(&epma_dev->rmem_lock);
-+
-+	if (epma_dev->num_free_pages < num_pages_to_alloc) {
-+		dev_err(epma_dev->dev, "not enough free pages\n");
-+		devm_kfree(epma_dev->dev, pma);
-+		spin_unlock(&epma_dev->rmem_lock);
-+		return NULL;
-+	}
-+
-+	/*
-+	 * For order 0-5 (ie, 1 to 32 pages) we always allocate within the same set of 64 pages
-+	 * Currently, most allocations will be very small (1 page), so the more likely path
-+	 * here is order < ORDER_OF_PAGES_PER_BITFIELD_ELEM.
-+	 */
-+	if (likely(order < ORDER_OF_PAGES_PER_BITFIELD_ELEM)) {
-+		size_t alloc_pages_bitmap_size = ALLOC_PAGES_BITFIELD_ARR_SIZE(epma_dev->rmem_size);
-+
-+		for (i = 0; i < alloc_pages_bitmap_size; i++) {
-+			count = 0;
-+
-+			for (bit = 0; bit < PAGES_PER_BITFIELD_ELEM; bit++) {
-+				if  (0 == (bitfields[i] & (1ULL << bit))) {
-+					if ((count + 1) >= num_pages_to_alloc) {
-+						/*
-+						 * We've found enough free, consecutive pages with which to
-+						 * make an allocation
-+						 */
-+						small_granularity_alloc(
-+							epma_dev, i,
-+							bit - count, order,
-+							pma);
-+
-+						epma_dev->num_free_pages -=
-+							num_pages_to_alloc;
-+
-+						spin_unlock(
-+							&epma_dev->rmem_lock);
-+						return pma;
-+					}
-+
-+					/* So far so good, but we need more set bits yet */
-+					count++;
-+				} else {
-+					/*
-+					 * We found an allocated page, so nothing we've seen so far can be used.
-+					 * Keep looking.
-+					 */
-+					count = 0;
-+				}
-+			}
-+		}
-+	} else {
-+		/**
-+		 * For allocations of order ORDER_OF_PAGES_PER_BITFIELD_ELEM and above (>= 64 pages), we know
-+		 * we'll only get allocations for whole groups of 64 pages, which hugely simplifies the task.
-+		 */
-+		size_t alloc_pages_bitmap_size = ALLOC_PAGES_BITFIELD_ARR_SIZE(epma_dev->rmem_size);
-+
-+		/* How many 64-bit bitfield elements will be needed for the allocation? */
-+		size_t num_bitfield_elements_needed = num_pages_to_alloc / PAGES_PER_BITFIELD_ELEM;
-+
-+		count = 0;
-+
-+		for (i = 0; i < alloc_pages_bitmap_size; i++) {
-+			/* Are all the pages free for the i'th u64 bitfield element? */
-+			if (bitfields[i] == 0) {
-+				count += PAGES_PER_BITFIELD_ELEM;
-+
-+				if (count >= (1 << order)) {
-+					size_t start_idx = (i + 1) - num_bitfield_elements_needed;
-+
-+					large_granularity_alloc(epma_dev,
-+								start_idx,
-+								order, pma);
-+
-+					epma_dev->num_free_pages -= 1 << order;
-+					spin_unlock(&epma_dev->rmem_lock);
-+					return pma;
-+				}
-+			}
-+			else
-+			{
-+				count = 0;
-+			}
-+		}
-+	}
-+
-+	spin_unlock(&epma_dev->rmem_lock);
-+	devm_kfree(epma_dev->dev, pma);
-+
-+	dev_err(epma_dev->dev, "not enough contiguous pages (need %zu), total free pages left %zu\n",
-+		num_pages_to_alloc, epma_dev->num_free_pages);
-+	return NULL;
-+}
-+
-+static phys_addr_t simple_pma_get_phys_addr(
-+	struct protected_memory_allocator_device *pma_dev,
-+	struct protected_memory_allocation *pma)
-+{
-+	struct simple_pma_device *const epma_dev =
-+		container_of(pma_dev, struct simple_pma_device, pma_dev);
-+
-+	dev_dbg(epma_dev->dev, "%s(pma_dev=%px, pma=%px, pa=%llx\n",
-+		__func__, (void *)pma_dev, (void *)pma,
-+		(unsigned long long)pma->pa);
-+
-+	return pma->pa;
-+}
-+
-+static void simple_pma_free_page(
-+	struct protected_memory_allocator_device *pma_dev,
-+	struct protected_memory_allocation *pma)
-+{
-+	struct simple_pma_device *const epma_dev =
-+		container_of(pma_dev, struct simple_pma_device, pma_dev);
-+	size_t num_pages_in_allocation;
-+	size_t offset;
-+	size_t i;
-+	size_t bitfield_idx;
-+	size_t bitfield_start_bit;
-+	size_t page_num;
-+	u64 *bitfield;
-+	size_t alloc_pages_bitmap_size;
-+	size_t num_bitfield_elems_used_by_alloc;
-+
-+	WARN_ON(pma == NULL);
-+
-+	dev_dbg(epma_dev->dev, "%s(pma_dev=%px, pma=%px, pa=%llx\n",
-+		__func__, (void *)pma_dev, (void *)pma,
-+		(unsigned long long)pma->pa);
-+
-+	WARN_ON(pma->pa < epma_dev->rmem_base);
-+
-+	/* This is an example function that follows an extremely simple logic
-+	 * and is vulnerable to abuse.
-+	 */
-+	offset = (pma->pa - epma_dev->rmem_base);
-+	num_pages_in_allocation = (size_t)1 << pma->order;
-+
-+	/* The number of bitfield elements used by the allocation */
-+	num_bitfield_elems_used_by_alloc = num_pages_in_allocation / PAGES_PER_BITFIELD_ELEM;
-+
-+	/* The page number of the first page of the allocation, relative to rmem_base */
-+	page_num = offset >> PAGE_SHIFT;
-+
-+	/* Which u64 bitfield refers to this page? */
-+	bitfield_idx = page_num / PAGES_PER_BITFIELD_ELEM;
-+
-+	alloc_pages_bitmap_size = ALLOC_PAGES_BITFIELD_ARR_SIZE(epma_dev->rmem_size);
-+
-+	/* Is the allocation within expected bounds? */
-+	WARN_ON((bitfield_idx + num_bitfield_elems_used_by_alloc) >= alloc_pages_bitmap_size);
-+
-+	spin_lock(&epma_dev->rmem_lock);
-+
-+	if (pma->order < ORDER_OF_PAGES_PER_BITFIELD_ELEM) {
-+		bitfield = &epma_dev->allocated_pages_bitfield_arr[bitfield_idx];
-+
-+		/* Which bit within that u64 bitfield is the lsb covering this allocation?  */
-+		bitfield_start_bit = page_num % PAGES_PER_BITFIELD_ELEM;
-+
-+		/* Clear the bits for the pages we're now freeing */
-+		*bitfield &= ~(((1ULL << num_pages_in_allocation) - 1) << bitfield_start_bit);
-+	}
-+	else {
-+		WARN(page_num % PAGES_PER_BITFIELD_ELEM,
-+		     "%s: Expecting allocs of order >= %d to be %zu-page aligned\n",
-+		     __FUNCTION__, ORDER_OF_PAGES_PER_BITFIELD_ELEM, PAGES_PER_BITFIELD_ELEM);
-+
-+		for (i = 0; i < num_bitfield_elems_used_by_alloc; i++) {
-+			bitfield = &epma_dev->allocated_pages_bitfield_arr[bitfield_idx + i];
-+
-+			/* We expect all bits to be set (all pages allocated) */
-+			WARN((*bitfield != ~0),
-+			     "%s: alloc being freed is not fully allocated: of=%zu np=%zu bf=%.16llx\n",
-+			     __FUNCTION__, offset, num_pages_in_allocation, *bitfield);
-+
-+			/*
-+			 * Now clear all the bits in the bitfield element to mark all the pages
-+			 * it refers to as free.
-+			 */
-+			*bitfield = 0ULL;
-+		}
-+	}
-+
-+	epma_dev->num_free_pages += num_pages_in_allocation;
-+	spin_unlock(&epma_dev->rmem_lock);
-+	devm_kfree(epma_dev->dev, pma);
-+}
-+
-+static int protected_memory_allocator_probe(struct platform_device *pdev)
-+{
-+	struct simple_pma_device *epma_dev;
-+	struct device_node *np;
-+	phys_addr_t rmem_base;
-+	size_t rmem_size;
-+	size_t alloc_bitmap_pages_arr_size;
-+#if (KERNEL_VERSION(4, 15, 0) <= LINUX_VERSION_CODE)
-+	struct reserved_mem *rmem;
-+#endif
-+
-+	np = pdev->dev.of_node;
-+
-+	if (!np) {
-+		dev_err(&pdev->dev, "device node pointer not set\n");
-+		return -ENODEV;
-+	}
-+
-+	np = of_parse_phandle(np, "memory-region", 0);
-+	if (!np) {
-+		dev_err(&pdev->dev, "memory-region node not set\n");
-+		return -ENODEV;
-+	}
-+
-+#if (KERNEL_VERSION(4, 15, 0) <= LINUX_VERSION_CODE)
-+	rmem = of_reserved_mem_lookup(np);
-+	if (rmem) {
-+		rmem_base = rmem->base;
-+		rmem_size = rmem->size >> PAGE_SHIFT;
-+	} else
-+#endif
-+	{
-+		of_node_put(np);
-+		dev_err(&pdev->dev, "could not read reserved memory-region\n");
-+		return -ENODEV;
-+	}
-+
-+	of_node_put(np);
-+	epma_dev = devm_kzalloc(&pdev->dev, sizeof(*epma_dev), GFP_KERNEL);
-+	if (!epma_dev)
-+		return -ENOMEM;
-+
-+	epma_dev->pma_dev.ops.pma_alloc_page = simple_pma_alloc_page;
-+	epma_dev->pma_dev.ops.pma_get_phys_addr = simple_pma_get_phys_addr;
-+	epma_dev->pma_dev.ops.pma_free_page = simple_pma_free_page;
-+	epma_dev->pma_dev.owner = THIS_MODULE;
-+	epma_dev->dev = &pdev->dev;
-+	epma_dev->rmem_base = rmem_base;
-+	epma_dev->rmem_size = rmem_size;
-+	epma_dev->num_free_pages = rmem_size;
-+	spin_lock_init(&epma_dev->rmem_lock);
-+
-+	alloc_bitmap_pages_arr_size = ALLOC_PAGES_BITFIELD_ARR_SIZE(epma_dev->rmem_size);
-+
-+	epma_dev->allocated_pages_bitfield_arr = devm_kzalloc(&pdev->dev,
-+		alloc_bitmap_pages_arr_size * BITFIELD_ELEM_SIZE, GFP_KERNEL);
-+
-+	if (!epma_dev->allocated_pages_bitfield_arr) {
-+		dev_err(&pdev->dev, "failed to allocate resources\n");
-+		devm_kfree(&pdev->dev, epma_dev);
-+		return -ENOMEM;
-+	}
-+
-+	if (epma_dev->rmem_size % PAGES_PER_BITFIELD_ELEM) {
-+		size_t extra_pages =
-+			alloc_bitmap_pages_arr_size * PAGES_PER_BITFIELD_ELEM -
-+			epma_dev->rmem_size;
-+		size_t last_bitfield_index = alloc_bitmap_pages_arr_size - 1;
-+
-+		/* Mark the extra pages (that lie outside the reserved range) as
-+		 * always in use.
-+		 */
-+		epma_dev->allocated_pages_bitfield_arr[last_bitfield_index] =
-+			((1ULL << extra_pages) - 1) <<
-+			(PAGES_PER_BITFIELD_ELEM - extra_pages);
-+	}
-+
-+	platform_set_drvdata(pdev, &epma_dev->pma_dev);
-+	dev_info(&pdev->dev,
-+		"Protected memory allocator probed successfully\n");
-+	dev_info(&pdev->dev, "Protected memory region: base=%llx num pages=%zu\n",
-+		(unsigned long long)rmem_base, rmem_size);
-+
-+	return 0;
-+}
-+
-+static int protected_memory_allocator_remove(struct platform_device *pdev)
-+{
-+	struct protected_memory_allocator_device *pma_dev =
-+		platform_get_drvdata(pdev);
-+	struct simple_pma_device *epma_dev;
-+	struct device *dev;
-+
-+	if (!pma_dev)
-+		return -EINVAL;
-+
-+	epma_dev = container_of(pma_dev, struct simple_pma_device, pma_dev);
-+	dev = epma_dev->dev;
-+
-+	if (epma_dev->num_free_pages < epma_dev->rmem_size) {
-+		dev_warn(&pdev->dev, "Leaking %zu pages of protected memory\n",
-+			epma_dev->rmem_size - epma_dev->num_free_pages);
-+	}
-+
-+	platform_set_drvdata(pdev, NULL);
-+	devm_kfree(dev, epma_dev->allocated_pages_bitfield_arr);
-+	devm_kfree(dev, epma_dev);
-+
-+	dev_info(&pdev->dev,
-+		"Protected memory allocator removed successfully\n");
-+
-+	return 0;
-+}
-+
-+static const struct of_device_id protected_memory_allocator_dt_ids[] = {
-+	{ .compatible = "arm,protected-memory-allocator" },
-+	{ /* sentinel */ }
-+};
-+MODULE_DEVICE_TABLE(of, protected_memory_allocator_dt_ids);
-+
-+static struct platform_driver protected_memory_allocator_driver = {
-+	.probe = protected_memory_allocator_probe,
-+	.remove = protected_memory_allocator_remove,
-+	.driver = {
-+		.name = "simple_protected_memory_allocator",
-+		.of_match_table = of_match_ptr(protected_memory_allocator_dt_ids),
-+	}
-+};
-+
-+module_platform_driver(protected_memory_allocator_driver);
-+
-+MODULE_LICENSE("GPL");
-+MODULE_AUTHOR("ARM Ltd.");
-+MODULE_VERSION("1.0");
-diff --git a/dvalin/kernel/drivers/base/dma_buf_test_exporter/Kconfig b/dvalin/kernel/drivers/base/dma_buf_test_exporter/Kconfig
-deleted file mode 100644
-index 66ca1bc..0000000
---- a/dvalin/kernel/drivers/base/dma_buf_test_exporter/Kconfig
-+++ /dev/null
-@@ -1,26 +0,0 @@
--#
--# (C) COPYRIGHT 2012 ARM Limited. All rights reserved.
--#
--# This program is free software and is provided to you under the terms of the
--# GNU General Public License version 2 as published by the Free Software
--# Foundation, and any use by you of this program is subject to the terms
--# of such GNU licence.
--#
--# This program is distributed in the hope that it will be useful,
--# but WITHOUT ANY WARRANTY; without even the implied warranty of
--# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
--# GNU General Public License for more details.
--#
--# You should have received a copy of the GNU General Public License
--# along with this program; if not, you can access it online at
--# http://www.gnu.org/licenses/gpl-2.0.html.
--#
--# SPDX-License-Identifier: GPL-2.0
--#
--#
--
--config DMA_SHARED_BUFFER_TEST_EXPORTER
--	tristate "Test exporter for the dma-buf framework"
--	depends on DMA_SHARED_BUFFER
--	help
--	  This option enables the test exporter usable to help test importerts.
-diff --git a/dvalin/kernel/drivers/base/dma_buf_test_exporter/Makefile b/dvalin/kernel/drivers/base/dma_buf_test_exporter/Makefile
-deleted file mode 100644
-index 528582c..0000000
---- a/dvalin/kernel/drivers/base/dma_buf_test_exporter/Makefile
-+++ /dev/null
-@@ -1,36 +0,0 @@
--#
--# (C) COPYRIGHT 2011-2013 ARM Limited. All rights reserved.
--#
--# This program is free software and is provided to you under the terms of the
--# GNU General Public License version 2 as published by the Free Software
--# Foundation, and any use by you of this program is subject to the terms
--# of such GNU licence.
--#
--# This program is distributed in the hope that it will be useful,
--# but WITHOUT ANY WARRANTY; without even the implied warranty of
--# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
--# GNU General Public License for more details.
--#
--# You should have received a copy of the GNU General Public License
--# along with this program; if not, you can access it online at
--# http://www.gnu.org/licenses/gpl-2.0.html.
--#
--# SPDX-License-Identifier: GPL-2.0
--#
--#
--
--# linux build system bootstrap for out-of-tree module
--
--# default to building for the host
--ARCH ?= $(shell uname -m)
--
--ifeq ($(KDIR),)
--$(error Must specify KDIR to point to the kernel to target))
--endif
--
--all:
--	$(MAKE) ARCH=$(ARCH) -C $(KDIR) M=$(CURDIR) EXTRA_CFLAGS="-I$(CURDIR)/../../../include" CONFIG_DMA_SHARED_BUFFER_TEST_EXPORTER=m
--
--clean:
--	$(MAKE) ARCH=$(ARCH) -C $(KDIR) M=$(CURDIR) clean
--
-diff --git a/dvalin/kernel/drivers/base/dma_buf_test_exporter/build.bp b/dvalin/kernel/drivers/base/dma_buf_test_exporter/build.bp
-deleted file mode 100644
-index 7b0bd5d..0000000
---- a/dvalin/kernel/drivers/base/dma_buf_test_exporter/build.bp
-+++ /dev/null
-@@ -1,26 +0,0 @@
--/*
-- *
-- * (C) COPYRIGHT 2017, 2020 ARM Limited. All rights reserved.
-- *
-- * This program is free software and is provided to you under the terms of the
-- * GNU General Public License version 2 as published by the Free Software
-- * Foundation, and any use by you of this program is subject to the terms
-- * of such GNU licence.
-- *
-- * A copy of the licence is included with the program, and can also be obtained
-- * from Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
-- * Boston, MA 02110-1301, USA.
-- *
-- */
--
--bob_kernel_module {
--    name: "dma-buf-test-exporter",
--    srcs: [
--        "Kbuild",
--        "dma-buf-test-exporter.c",
--    ],
--    kbuild_options: [
--        "CONFIG_DMA_SHARED_BUFFER_TEST_EXPORTER=m",
--    ],
--    defaults: ["kernel_defaults"],
--}
-diff --git a/dvalin/kernel/drivers/base/memory_group_manager/Makefile b/dvalin/kernel/drivers/base/memory_group_manager/Makefile
-deleted file mode 100644
-index a5bceae..0000000
---- a/dvalin/kernel/drivers/base/memory_group_manager/Makefile
-+++ /dev/null
-@@ -1,35 +0,0 @@
--#
--# (C) COPYRIGHT 2019 ARM Limited. All rights reserved.
--#
--# This program is free software and is provided to you under the terms of the
--# GNU General Public License version 2 as published by the Free Software
--# Foundation, and any use by you of this program is subject to the terms
--# of such GNU licence.
--#
--# This program is distributed in the hope that it will be useful,
--# but WITHOUT ANY WARRANTY; without even the implied warranty of
--# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
--# GNU General Public License for more details.
--#
--# You should have received a copy of the GNU General Public License
--# along with this program; if not, you can access it online at
--# http://www.gnu.org/licenses/gpl-2.0.html.
--#
--# SPDX-License-Identifier: GPL-2.0
--#
--#
--
--# linux build system bootstrap for out-of-tree module
--
--# default to building for the host
--ARCH ?= $(shell uname -m)
--
--ifeq ($(KDIR),)
--$(error Must specify KDIR to point to the kernel to target))
--endif
--
--all:
--	$(MAKE) ARCH=$(ARCH) -C $(KDIR) M=$(CURDIR) EXTRA_CFLAGS="-I$(CURDIR)/../../../include" modules CONFIG_MALI_MEMORY_GROUP_MANAGER=m
--
--clean:
--	$(MAKE) ARCH=$(ARCH) -C $(KDIR) M=$(CURDIR) clean
-diff --git a/dvalin/kernel/drivers/base/memory_group_manager/build.bp b/dvalin/kernel/drivers/base/memory_group_manager/build.bp
-deleted file mode 100644
-index 04dbfd3..0000000
---- a/dvalin/kernel/drivers/base/memory_group_manager/build.bp
-+++ /dev/null
-@@ -1,22 +0,0 @@
--/*
-- * (C) COPYRIGHT 2019 ARM Limited. All rights reserved.
-- *
-- * This program is free software and is provided to you under the terms of the
-- * GNU General Public License version 2 as published by the Free Software
-- * Foundation, and any use by you of this program is subject to the terms
-- * of such GNU licence.
-- *
-- * A copy of the licence is included with the program, and can also be obtained
-- * from Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
-- * Boston, MA  02110-1301, USA.
-- */
--
--bob_kernel_module {
--    name: "memory_group_manager",
--    srcs: [
--        "Kbuild",
--        "memory_group_manager.c",
--    ],
--    kbuild_options: ["CONFIG_MALI_MEMORY_GROUP_MANAGER=m"],
--    defaults: ["kernel_defaults"],
--}
-diff --git a/dvalin/kernel/drivers/base/protected_memory_allocator/Makefile b/dvalin/kernel/drivers/base/protected_memory_allocator/Makefile
-deleted file mode 100644
-index 17b2600..0000000
---- a/dvalin/kernel/drivers/base/protected_memory_allocator/Makefile
-+++ /dev/null
-@@ -1,35 +0,0 @@
--#
--# (C) COPYRIGHT 2019 ARM Limited. All rights reserved.
--#
--# This program is free software and is provided to you under the terms of the
--# GNU General Public License version 2 as published by the Free Software
--# Foundation, and any use by you of this program is subject to the terms
--# of such GNU licence.
--#
--# This program is distributed in the hope that it will be useful,
--# but WITHOUT ANY WARRANTY; without even the implied warranty of
--# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
--# GNU General Public License for more details.
--#
--# You should have received a copy of the GNU General Public License
--# along with this program; if not, you can access it online at
--# http://www.gnu.org/licenses/gpl-2.0.html.
--#
--# SPDX-License-Identifier: GPL-2.0
--#
--#
--
--# linux build system bootstrap for out-of-tree module
--
--# default to building for the host
--ARCH ?= $(shell uname -m)
--
--ifeq ($(KDIR),)
--$(error Must specify KDIR to point to the kernel to target))
--endif
--
--all:
--	$(MAKE) ARCH=$(ARCH) -C $(KDIR) M=$(CURDIR) EXTRA_CFLAGS="-I$(CURDIR)/../../../include" modules CONFIG_MALI_PROTECTED_MEMORY_ALLOCATOR=m
--
--clean:
--	$(MAKE) ARCH=$(ARCH) -C $(KDIR) M=$(CURDIR) clean
-diff --git a/dvalin/kernel/drivers/base/protected_memory_allocator/build.bp b/dvalin/kernel/drivers/base/protected_memory_allocator/build.bp
-deleted file mode 100644
-index 165b17b..0000000
---- a/dvalin/kernel/drivers/base/protected_memory_allocator/build.bp
-+++ /dev/null
-@@ -1,26 +0,0 @@
--/*
-- * (C) COPYRIGHT 2019 ARM Limited. All rights reserved.
-- *
-- * This program is free software and is provided to you under the terms of the
-- * GNU General Public License version 2 as published by the Free Software
-- * Foundation, and any use by you of this program is subject to the terms
-- * of such GNU licence.
-- *
-- * A copy of the licence is included with the program, and can also be obtained
-- * from Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
-- * Boston, MA  02110-1301, USA.
-- */
--
--bob_kernel_module {
--    name: "protected_memory_allocator",
--    srcs: [
--        "Kbuild",
--        "protected_memory_allocator.c",
--    ],
--    kbuild_options: ["CONFIG_MALI_PROTECTED_MEMORY_ALLOCATOR=m"],
--    defaults: ["kernel_defaults"],
--    enabled: false,
--    build_csf_only_module: {
--        enabled: true,
--    },
--}
-diff --git a/dvalin/kernel/drivers/base/protected_memory_allocator/protected_memory_allocator.c b/dvalin/kernel/drivers/base/protected_memory_allocator/protected_memory_allocator.c
-deleted file mode 100644
-index bb0b1dd..0000000
---- a/dvalin/kernel/drivers/base/protected_memory_allocator/protected_memory_allocator.c
-+++ /dev/null
-@@ -1,308 +0,0 @@
--/*
-- *
-- * (C) COPYRIGHT 2019-2020 ARM Limited. All rights reserved.
-- *
-- * This program is free software and is provided to you under the terms of the
-- * GNU General Public License version 2 as published by the Free Software
-- * Foundation, and any use by you of this program is subject to the terms
-- * of such GNU licence.
-- *
-- * This program is distributed in the hope that it will be useful,
-- * but WITHOUT ANY WARRANTY; without even the implied warranty of
-- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-- * GNU General Public License for more details.
-- *
-- * You should have received a copy of the GNU General Public License
-- * along with this program; if not, you can access it online at
-- * http://www.gnu.org/licenses/gpl-2.0.html.
-- *
-- * SPDX-License-Identifier: GPL-2.0
-- *
-- */
--
--#include <linux/version.h>
--#include <linux/of.h>
--#include <linux/of_reserved_mem.h>
--#include <linux/platform_device.h>
--#include <linux/module.h>
--#include <linux/slab.h>
--#include <linux/mm.h>
--#include <linux/io.h>
--#include <linux/protected_memory_allocator.h>
--
--/**
-- * struct simple_pma_device - Simple implementation of a protected memory
-- *                            allocator device
-- *
-- * @pma_dev:        Protected memory allocator device pointer
-- * @dev:            Device pointer
-- * @alloc_pages:    Status of all the physical memory pages within the
-- *                  protected memory region; true for allocated pages
-- * @rmem_base:      Base address of the reserved memory region
-- * @rmem_size:      Size of the reserved memory region, in pages
-- * @free_pa_offset: Offset of the lowest physical address within the protected
-- *                  memory region that is currently associated with a free page
-- * @num_free_pages: Number of free pages in the memory region
-- */
--struct simple_pma_device {
--	struct protected_memory_allocator_device pma_dev;
--	struct device *dev;
--	bool *alloc_pages;
--	phys_addr_t rmem_base;
--	size_t rmem_size;
--	size_t free_pa_offset;
--	size_t num_free_pages;
--};
--
--static struct protected_memory_allocation *simple_pma_alloc_page(
--	struct protected_memory_allocator_device *pma_dev, unsigned int order)
--{
--	struct simple_pma_device *const epma_dev =
--		container_of(pma_dev, struct simple_pma_device, pma_dev);
--	struct protected_memory_allocation *pma;
--	size_t num_pages;
--	size_t i;
--
--	dev_dbg(epma_dev->dev, "%s(pma_dev=%px, order=%u\n",
--		__func__, (void *)pma_dev, order);
--
--	/* This is an example function that follows an extremely simple logic
--	 * and is very likely to fail to allocate memory if put under stress.
--	 *
--	 * The simple_pma_device maintains an array of booleans to track
--	 * the status of every page and an offset to the free page to use
--	 * for the next allocation. The offset starts from 0 and can only grow,
--	 * and be reset when the end of the memory region is reached.
--	 *
--	 * In order to create a memory allocation, the allocator simply looks
--	 * at the offset and verifies whether there are enough free pages
--	 * after it to accommodate the allocation request. If successful,
--	 * the allocator shall mark all the pages as allocated and increment
--	 * the offset accordingly.
--	 *
--	 * The allocator does not look for any other free pages inside the
--	 * memory region, even if plenty of free memory is available.
--	 * Free memory pages are counted and the offset is ignored if the
--	 * memory region is fully allocated.
--	 */
--
--	/* The only candidate for allocation is the sub-region starting
--	 * from the free_pa_offset. Verify that enough contiguous pages
--	 * are available and that they are all free.
--	 */
--	num_pages = (size_t)1 << order;
--
--	if (epma_dev->num_free_pages < num_pages)
--		dev_err(epma_dev->dev, "not enough free pages\n");
--
--	if (epma_dev->free_pa_offset + num_pages > epma_dev->rmem_size) {
--		dev_err(epma_dev->dev, "not enough contiguous pages\n");
--		return NULL;
--	}
--
--	for (i = 0; i < num_pages; i++)
--		if (epma_dev->alloc_pages[epma_dev->free_pa_offset + i])
--			break;
--
--	if (i < num_pages) {
--		dev_err(epma_dev->dev, "free pages are not contiguous\n");
--		return NULL;
--	}
--
--	/* Memory allocation is successful. Mark pages as allocated.
--	 * Update the free_pa_offset if free pages are still available:
--	 * increment the free_pa_offset accordingly, and then making sure
--	 * that it points at the next free page, potentially wrapping over
--	 * the end of the memory region.
--	 */
--	pma = devm_kzalloc(epma_dev->dev, sizeof(*pma), GFP_KERNEL);
--	if (!pma)
--		return NULL;
--
--	pma->pa = epma_dev->rmem_base + (epma_dev->free_pa_offset << PAGE_SHIFT);
--	pma->order = order;
--
--	for (i = 0; i < num_pages; i++)
--		epma_dev->alloc_pages[epma_dev->free_pa_offset + i] = true;
--
--	epma_dev->num_free_pages -= num_pages;
--
--	if (epma_dev->num_free_pages) {
--		epma_dev->free_pa_offset += num_pages;
--		i = 0;
--		while (epma_dev->alloc_pages[epma_dev->free_pa_offset + i]) {
--			epma_dev->free_pa_offset++;
--			if (epma_dev->free_pa_offset > epma_dev->rmem_size)
--				epma_dev->free_pa_offset = 0;
--		}
--	}
--
--	return pma;
--}
--
--static phys_addr_t simple_pma_get_phys_addr(
--	struct protected_memory_allocator_device *pma_dev,
--	struct protected_memory_allocation *pma)
--{
--	struct simple_pma_device *const epma_dev =
--		container_of(pma_dev, struct simple_pma_device, pma_dev);
--
--	dev_dbg(epma_dev->dev, "%s(pma_dev=%px, pma=%px, pa=%llx\n",
--		__func__, (void *)pma_dev, (void *)pma, pma->pa);
--
--	return pma->pa;
--}
--
--static void simple_pma_free_page(
--	struct protected_memory_allocator_device *pma_dev,
--	struct protected_memory_allocation *pma)
--{
--	struct simple_pma_device *const epma_dev =
--		container_of(pma_dev, struct simple_pma_device, pma_dev);
--	size_t num_pages;
--	size_t offset;
--	size_t i;
--
--	dev_dbg(epma_dev->dev, "%s(pma_dev=%px, pma=%px, pa=%llx\n",
--		__func__, (void *)pma_dev, (void *)pma, pma->pa);
--
--	/* This is an example function that follows an extremely simple logic
--	 * and is vulnerable to abuse. For instance, double frees won't be
--	 * detected.
--	 *
--	 * If memory is full, must update the free_pa_offset that is currently
--	 * pointing at an allocated page.
--	 *
--	 * Increase the number of free pages and mark them as free.
--	 */
--	offset = (pma->pa - epma_dev->rmem_base) >> PAGE_SHIFT;
--	num_pages = (size_t)1 << pma->order;
--
--	if (epma_dev->num_free_pages == 0)
--		epma_dev->free_pa_offset = offset;
--
--	epma_dev->num_free_pages += num_pages;
--	for (i = 0; i < num_pages; i++)
--		epma_dev->alloc_pages[offset + i] = false;
--
--	devm_kfree(epma_dev->dev, pma);
--}
--
--static int protected_memory_allocator_probe(struct platform_device *pdev)
--{
--	struct simple_pma_device *epma_dev;
--	struct device_node *np;
--	phys_addr_t rmem_base;
--	size_t rmem_size;
--#if (KERNEL_VERSION(4, 15, 0) <= LINUX_VERSION_CODE)
--	struct reserved_mem *rmem;
--#endif
--
--	np = pdev->dev.of_node;
--
--	if (!np) {
--		dev_err(&pdev->dev, "device node pointer not set\n");
--		return -ENODEV;
--	}
--
--	np = of_parse_phandle(np, "memory-region", 0);
--	if (!np) {
--		dev_err(&pdev->dev, "memory-region node not set\n");
--		return -ENODEV;
--	}
--
--#if (KERNEL_VERSION(4, 15, 0) <= LINUX_VERSION_CODE)
--	rmem = of_reserved_mem_lookup(np);
--	if (rmem) {
--		rmem_base = rmem->base;
--		rmem_size = rmem->size >> PAGE_SHIFT;
--	} else
--#endif
--	{
--		of_node_put(np);
--		dev_err(&pdev->dev, "could not read reserved memory-region\n");
--		return -ENODEV;
--	}
--
--	of_node_put(np);
--	epma_dev = devm_kzalloc(&pdev->dev, sizeof(*epma_dev), GFP_KERNEL);
--	if (!epma_dev)
--		return -ENOMEM;
--
--	epma_dev->pma_dev.ops.pma_alloc_page = simple_pma_alloc_page;
--	epma_dev->pma_dev.ops.pma_get_phys_addr = simple_pma_get_phys_addr;
--	epma_dev->pma_dev.ops.pma_free_page = simple_pma_free_page;
--	epma_dev->pma_dev.owner = THIS_MODULE;
--	epma_dev->dev = &pdev->dev;
--	epma_dev->rmem_base = rmem_base;
--	epma_dev->rmem_size = rmem_size;
--	epma_dev->free_pa_offset = 0;
--	epma_dev->num_free_pages = rmem_size;
--
--	epma_dev->alloc_pages =	devm_kzalloc(&pdev->dev,
--		sizeof(bool) * epma_dev->rmem_size, GFP_KERNEL);
--
--	if (!epma_dev->alloc_pages) {
--		dev_err(&pdev->dev, "failed to allocate resources\n");
--		devm_kfree(&pdev->dev, epma_dev);
--		return -ENOMEM;
--	}
--
--	platform_set_drvdata(pdev, &epma_dev->pma_dev);
--	dev_info(&pdev->dev,
--		"Protected memory allocator probed successfully\n");
--	dev_info(&pdev->dev, "Protected memory region: base=%llx num pages=%zu\n",
--		rmem_base, rmem_size);
--
--	return 0;
--}
--
--static int protected_memory_allocator_remove(struct platform_device *pdev)
--{
--	struct protected_memory_allocator_device *pma_dev =
--		platform_get_drvdata(pdev);
--	struct simple_pma_device *epma_dev;
--	struct device *dev;
--
--	if (!pma_dev)
--		return -EINVAL;
--
--	epma_dev = container_of(pma_dev, struct simple_pma_device, pma_dev);
--	dev = epma_dev->dev;
--
--	if (epma_dev->num_free_pages < epma_dev->rmem_size) {
--		dev_warn(&pdev->dev, "Leaking %zu pages of protected memory\n",
--			epma_dev->rmem_size - epma_dev->num_free_pages);
--	}
--
--	platform_set_drvdata(pdev, NULL);
--	devm_kfree(dev, epma_dev->alloc_pages);
--	devm_kfree(dev, epma_dev);
--
--	dev_info(&pdev->dev,
--		"Protected memory allocator removed successfully\n");
--
--	return 0;
--}
--
--static const struct of_device_id protected_memory_allocator_dt_ids[] = {
--	{ .compatible = "arm,protected-memory-allocator" },
--	{ /* sentinel */ }
--};
--MODULE_DEVICE_TABLE(of, protected_memory_allocator_dt_ids);
--
--static struct platform_driver protected_memory_allocator_driver = {
--	.probe = protected_memory_allocator_probe,
--	.remove = protected_memory_allocator_remove,
--	.driver = {
--		.name = "simple_protected_memory_allocator",
--		.owner = THIS_MODULE,
--		.of_match_table = of_match_ptr(protected_memory_allocator_dt_ids),
--	}
--};
--
--module_platform_driver(protected_memory_allocator_driver);
--
--MODULE_LICENSE("GPL");
--MODULE_AUTHOR("ARM Ltd.");
--MODULE_VERSION("1.0");
-diff --git a/dvalin/kernel/drivers/gpu/arm/Kbuild b/dvalin/kernel/drivers/gpu/arm/Kbuild
-index 1a6fa3c..52ea5fb 100644
---- a/dvalin/kernel/drivers/gpu/arm/Kbuild
-+++ b/dvalin/kernel/drivers/gpu/arm/Kbuild
-@@ -1,10 +1,11 @@
-+# SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note
- #
--# (C) COPYRIGHT 2012 ARM Limited. All rights reserved.
-+# (C) COPYRIGHT 2012, 2020-2021 ARM Limited. All rights reserved.
- #
- # This program is free software and is provided to you under the terms of the
- # GNU General Public License version 2 as published by the Free Software
- # Foundation, and any use by you of this program is subject to the terms
--# of such GNU licence.
-+# of such GNU license.
- #
- # This program is distributed in the hope that it will be useful,
- # but WITHOUT ANY WARRANTY; without even the implied warranty of
-@@ -15,9 +16,6 @@
- # along with this program; if not, you can access it online at
- # http://www.gnu.org/licenses/gpl-2.0.html.
- #
--# SPDX-License-Identifier: GPL-2.0
- #
--#
--
- 
- obj-$(CONFIG_MALI_MIDGARD) += midgard/
-diff --git a/dvalin/kernel/drivers/gpu/arm/Kconfig b/dvalin/kernel/drivers/gpu/arm/Kconfig
-index 693b86f..2da8c98 100644
---- a/dvalin/kernel/drivers/gpu/arm/Kconfig
-+++ b/dvalin/kernel/drivers/gpu/arm/Kconfig
-@@ -1,10 +1,11 @@
-+# SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note
- #
--# (C) COPYRIGHT 2012 ARM Limited. All rights reserved.
-+# (C) COPYRIGHT 2012, 2021 ARM Limited. All rights reserved.
- #
- # This program is free software and is provided to you under the terms of the
- # GNU General Public License version 2 as published by the Free Software
- # Foundation, and any use by you of this program is subject to the terms
--# of such GNU licence.
-+# of such GNU license.
- #
- # This program is distributed in the hope that it will be useful,
- # but WITHOUT ANY WARRANTY; without even the implied warranty of
-@@ -15,10 +16,7 @@
- # along with this program; if not, you can access it online at
- # http://www.gnu.org/licenses/gpl-2.0.html.
- #
--# SPDX-License-Identifier: GPL-2.0
- #
--#
--
- 
- menu "ARM GPU Configuration"
- source "drivers/gpu/arm/midgard/Kconfig"
-diff --git a/dvalin/kernel/drivers/base/protected_memory_allocator/Kbuild b/dvalin/kernel/drivers/gpu/arm/Makefile
-similarity index 77%
-rename from dvalin/kernel/drivers/base/protected_memory_allocator/Kbuild
-rename to dvalin/kernel/drivers/gpu/arm/Makefile
-index 241aeb9..ea9ecc7 100644
---- a/dvalin/kernel/drivers/base/protected_memory_allocator/Kbuild
-+++ b/dvalin/kernel/drivers/gpu/arm/Makefile
-@@ -1,10 +1,11 @@
-+# SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note
- #
--# (C) COPYRIGHT 2019 ARM Limited. All rights reserved.
-+# (C) COPYRIGHT 2021 ARM Limited. All rights reserved.
- #
- # This program is free software and is provided to you under the terms of the
- # GNU General Public License version 2 as published by the Free Software
- # Foundation, and any use by you of this program is subject to the terms
--# of such GNU licence.
-+# of such GNU license.
- #
- # This program is distributed in the hope that it will be useful,
- # but WITHOUT ANY WARRANTY; without even the implied warranty of
-@@ -15,8 +16,6 @@
- # along with this program; if not, you can access it online at
- # http://www.gnu.org/licenses/gpl-2.0.html.
- #
--# SPDX-License-Identifier: GPL-2.0
--#
- #
- 
--obj-$(CONFIG_MALI_PROTECTED_MEMORY_ALLOCATOR) := protected_memory_allocator.o
-\ No newline at end of file
-+include midgard/Makefile
-diff --git a/dvalin/kernel/drivers/gpu/arm/midgard/Kbuild b/dvalin/kernel/drivers/gpu/arm/midgard/Kbuild
-index fa52548..d3c4ee1 100755
---- a/dvalin/kernel/drivers/gpu/arm/midgard/Kbuild
-+++ b/dvalin/kernel/drivers/gpu/arm/midgard/Kbuild
-@@ -1,10 +1,11 @@
-+# SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note
- #
--# (C) COPYRIGHT 2012-2020 ARM Limited. All rights reserved.
-+# (C) COPYRIGHT 2012-2021 ARM Limited. All rights reserved.
- #
- # This program is free software and is provided to you under the terms of the
- # GNU General Public License version 2 as published by the Free Software
- # Foundation, and any use by you of this program is subject to the terms
--# of such GNU licence.
-+# of such GNU license.
- #
- # This program is distributed in the hope that it will be useful,
- # but WITHOUT ANY WARRANTY; without even the implied warranty of
-@@ -15,202 +16,240 @@
- # along with this program; if not, you can access it online at
- # http://www.gnu.org/licenses/gpl-2.0.html.
- #
--# SPDX-License-Identifier: GPL-2.0
- #
-+
-+# make $(src) as absolute path if it is not already, by prefixing $(srctree)
-+# This is to prevent any build issue due to wrong path.
-+src:=$(if $(patsubst /%,,$(src)),$(srctree)/$(src),$(src))
-+
- #
-+# Prevent misuse when Kernel configurations are not present by default
-+# in out-of-tree builds
-+#
-+ifneq ($(CONFIG_ANDROID),n)
-+ifeq ($(CONFIG_GPU_TRACEPOINTS),n)
-+    $(error CONFIG_GPU_TRACEPOINTS must be set in Kernel configuration)
-+endif
-+endif
- 
-+ifeq ($(CONFIG_DMA_SHARED_BUFFER),n)
-+    $(error CONFIG_DMA_SHARED_BUFFER must be set in Kernel configuration)
-+endif
- 
--# Driver version string which is returned to userspace via an ioctl
--MALI_RELEASE_NAME ?= "r25p0-01rel0"
-+ifeq ($(CONFIG_PM_DEVFREQ),n)
-+    $(error CONFIG_PM_DEVFREQ must be set in Kernel configuration)
-+endif
- 
--# Paths required for build
--# make $(src) as absolute path if it isn't already, by prefixing $(srctree)
--src:=$(if $(patsubst /%,,$(src)),$(srctree)/$(src),$(src))
--KBASE_PATH = $(src)
--KBASE_PLATFORM_PATH = $(KBASE_PATH)/platform_dummy
--UMP_PATH = $(src)/../../../base
-+ifeq ($(CONFIG_DEVFREQ_THERMAL),n)
-+    $(error CONFIG_DEVFREQ_THERMAL must be set in Kernel configuration)
-+endif
-+
-+ifeq ($(CONFIG_DEVFREQ_GOV_SIMPLE_ONDEMAND),n)
-+    $(error CONFIG_DEVFREQ_GOV_SIMPLE_ONDEMAND must be set in Kernel configuration)
-+endif
-+
-+ifeq ($(CONFIG_MALI_PRFCNT_SET_SELECT_VIA_DEBUG_FS), y)
-+    ifneq ($(CONFIG_DEBUG_FS), y)
-+        $(error CONFIG_MALI_PRFCNT_SET_SELECT_VIA_DEBUG_FS depends on CONFIG_DEBUG_FS to be set in Kernel configuration)
-+    endif
-+endif
-+
-+ifeq ($(CONFIG_MALI_FENCE_DEBUG), y)
-+    ifneq ($(CONFIG_SYNC), y)
-+        ifneq ($(CONFIG_SYNC_FILE), y)
-+            $(error CONFIG_MALI_FENCE_DEBUG depends on CONFIG_SYNC || CONFIG_SYNC_FILE to be set in Kernel configuration)
-+        endif
-+    endif
-+endif
- 
-+#
-+# Configurations
-+#
-+
-+# Driver version string which is returned to userspace via an ioctl
-+MALI_RELEASE_NAME ?= '"r32p1-01bet0"'
- # Set up defaults if not defined by build system
--MALI_CUSTOMER_RELEASE ?= 1
--MALI_USE_CSF ?= 0
--MALI_UNIT_TEST ?= 0
--MALI_KERNEL_TEST_API ?= 0
-+ifeq ($(CONFIG_MALI_DEBUG), y)
-+    MALI_UNIT_TEST = 1
-+    MALI_CUSTOMER_RELEASE ?= 0
-+else
-+    MALI_UNIT_TEST ?= 0
-+    MALI_CUSTOMER_RELEASE ?= 1
-+endif
- MALI_COVERAGE ?= 0
-+
- CONFIG_MALI_PLATFORM_NAME ?= "devicetree"
-+
-+# Kconfig passes in the name with quotes for in-tree builds - remove them.
-+MALI_PLATFORM_DIR := $(shell echo $(CONFIG_MALI_PLATFORM_NAME))
-+
-+ifeq ($(CONFIG_MALI_CSF_SUPPORT),y)
-+    MALI_JIT_PRESSURE_LIMIT_BASE = 0
-+    MALI_USE_CSF = 1
-+else
-+    MALI_JIT_PRESSURE_LIMIT_BASE ?= 1
-+    MALI_USE_CSF ?= 0
-+endif
-+
-+ifneq ($(CONFIG_MALI_KUTF), n)
-+    MALI_KERNEL_TEST_API ?= 1
-+else
-+    MALI_KERNEL_TEST_API ?= 0
-+endif
-+
- # Experimental features (corresponding -D definition should be appended to
--# DEFINES below, e.g. for MALI_EXPERIMENTAL_FEATURE,
-+# ccflags-y below, e.g. for MALI_EXPERIMENTAL_FEATURE,
- # -DMALI_EXPERIMENTAL_FEATURE=$(MALI_EXPERIMENTAL_FEATURE) should be appended)
- #
- # Experimental features must default to disabled, e.g.:
- # MALI_EXPERIMENTAL_FEATURE ?= 0
--MALI_JIT_PRESSURE_LIMIT ?= 0
- MALI_INCREMENTAL_RENDERING ?= 0
- 
--# Set up our defines, which will be passed to gcc
--DEFINES = \
--	-DMALI_CUSTOMER_RELEASE=$(MALI_CUSTOMER_RELEASE) \
--	-DMALI_USE_CSF=$(MALI_USE_CSF) \
--	-DMALI_KERNEL_TEST_API=$(MALI_KERNEL_TEST_API) \
--	-DMALI_UNIT_TEST=$(MALI_UNIT_TEST) \
--	-DMALI_COVERAGE=$(MALI_COVERAGE) \
--	-DMALI_RELEASE_NAME=\"$(MALI_RELEASE_NAME)\" \
--	-DMALI_JIT_PRESSURE_LIMIT=$(MALI_JIT_PRESSURE_LIMIT) \
--	-DMALI_INCREMENTAL_RENDERING=$(MALI_INCREMENTAL_RENDERING)
-+#
-+# ccflags
-+#
-+ccflags-y = \
-+    -DMALI_CUSTOMER_RELEASE=$(MALI_CUSTOMER_RELEASE) \
-+    -DMALI_USE_CSF=$(MALI_USE_CSF) \
-+    -DMALI_KERNEL_TEST_API=$(MALI_KERNEL_TEST_API) \
-+    -DMALI_UNIT_TEST=$(MALI_UNIT_TEST) \
-+    -DMALI_COVERAGE=$(MALI_COVERAGE) \
-+    -DMALI_RELEASE_NAME=$(MALI_RELEASE_NAME) \
-+    -DMALI_JIT_PRESSURE_LIMIT_BASE=$(MALI_JIT_PRESSURE_LIMIT_BASE) \
-+    -DMALI_INCREMENTAL_RENDERING=$(MALI_INCREMENTAL_RENDERING) \
-+    -DMALI_KBASE_BUILD \
-+    -DMALI_PLATFORM_DIR=$(MALI_PLATFORM_DIR)
-+
- 
- ifeq ($(KBUILD_EXTMOD),)
- # in-tree
--DEFINES +=-DMALI_KBASE_PLATFORM_PATH=../../$(src)/platform/$(CONFIG_MALI_PLATFORM_NAME)
-+    ccflags-y +=-DMALI_KBASE_PLATFORM_PATH=../../$(src)/platform/$(CONFIG_MALI_PLATFORM_NAME)
- else
- # out-of-tree
--DEFINES +=-DMALI_KBASE_PLATFORM_PATH=$(src)/platform/$(CONFIG_MALI_PLATFORM_NAME)
--endif
--
--DEFINES += -I$(srctree)/drivers/staging/android
--#meson graphics start
--ldflags-y += --strip-debug
--#meson graphics end
--
--DEFINES += -DMALI_KBASE_BUILD
--
--# Use our defines when compiling
--ccflags-y += $(DEFINES) -I$(KBASE_PATH)   -I$(KBASE_PLATFORM_PATH) -I$(UMP_PATH) -I$(srctree)/include/linux
--subdir-ccflags-y += $(DEFINES) -I$(KBASE_PATH)   -I$(KBASE_PLATFORM_PATH) -I$(UMP_PATH) -I$(srctree)/include/linux
--
--SRC := \
--	context/mali_kbase_context.c \
--	debug/mali_kbase_debug_ktrace.c \
--	device/mali_kbase_device.c \
--	mali_kbase_cache_policy.c \
--	mali_kbase_mem.c \
--	mali_kbase_mem_pool_group.c \
--	mali_kbase_native_mgm.c \
--	mali_kbase_ctx_sched.c \
--	mali_kbase_jm.c \
--	mali_kbase_gpuprops.c \
--	mali_kbase_pm.c \
--	mali_kbase_config.c \
--	mali_kbase_vinstr.c \
--	mali_kbase_hwcnt.c \
--	mali_kbase_hwcnt_backend_gpu.c \
--	mali_kbase_hwcnt_gpu.c \
--	mali_kbase_hwcnt_legacy.c \
--	mali_kbase_hwcnt_types.c \
--	mali_kbase_hwcnt_virtualizer.c \
--	mali_kbase_softjobs.c \
--	mali_kbase_hw.c \
--	mali_kbase_debug.c \
--	mali_kbase_gpu_memory_debugfs.c \
--	mali_kbase_mem_linux.c \
--	mali_kbase_core_linux.c \
--	mali_kbase_mem_profile_debugfs.c \
--	mmu/mali_kbase_mmu.c \
--	mmu/mali_kbase_mmu_hw_direct.c \
--	mmu/mali_kbase_mmu_mode_lpae.c \
--	mmu/mali_kbase_mmu_mode_aarch64.c \
--	mali_kbase_disjoint_events.c \
--	mali_kbase_debug_mem_view.c \
--	mali_kbase_smc.c \
--	mali_kbase_mem_pool.c \
--	mali_kbase_mem_pool_debugfs.c \
--	mali_kbase_debugfs_helper.c \
--	mali_kbase_strings.c \
--	mali_kbase_as_fault_debugfs.c \
--	mali_kbase_regs_history_debugfs.c \
--	thirdparty/mali_kbase_mmap.c \
--	tl/mali_kbase_timeline.c \
--	tl/mali_kbase_timeline_io.c \
--	tl/mali_kbase_tlstream.c \
--	tl/mali_kbase_tracepoints.c \
--	gpu/mali_kbase_gpu.c
--
--ifeq ($(MALI_USE_CSF),1)
--	SRC += \
--		debug/backend/mali_kbase_debug_ktrace_csf.c \
--		device/backend/mali_kbase_device_csf.c \
--		gpu/backend/mali_kbase_gpu_fault_csf.c \
--		tl/backend/mali_kbase_timeline_csf.c \
--		mmu/backend/mali_kbase_mmu_csf.c \
--		context/backend/mali_kbase_context_csf.c
--else
--	SRC += \
--		mali_kbase_dummy_job_wa.c \
--		mali_kbase_debug_job_fault.c \
--		mali_kbase_event.c \
--		mali_kbase_jd.c \
--		mali_kbase_jd_debugfs.c \
--		mali_kbase_js.c \
--		mali_kbase_js_ctx_attr.c \
--		debug/backend/mali_kbase_debug_ktrace_jm.c \
--		device/backend/mali_kbase_device_jm.c \
--		gpu/backend/mali_kbase_gpu_fault_jm.c \
--		tl/backend/mali_kbase_timeline_jm.c \
--		mmu/backend/mali_kbase_mmu_jm.c \
--		context/backend/mali_kbase_context_jm.c
-+    ccflags-y +=-DMALI_KBASE_PLATFORM_PATH=$(src)/platform/$(CONFIG_MALI_PLATFORM_NAME)
- endif
- 
--ifeq ($(CONFIG_MALI_CINSTR_GWT),y)
--	SRC += mali_kbase_gwt.c
--endif
-+ccflags-y += \
-+    -I$(srctree)/include/linux \
-+    -I$(srctree)/drivers/staging/android \
-+    -I$(src) \
-+    -I$(src)/platform/$(MALI_PLATFORM_DIR) \
-+    -I$(src)/../../../base \
-+    -I$(src)/../../../../include
- 
--ifeq ($(MALI_UNIT_TEST),1)
--	SRC += tl/mali_kbase_timeline_test.c
--endif
-+subdir-ccflags-y += $(ccflags-y)
- 
--ifeq ($(MALI_CUSTOMER_RELEASE),0)
--	SRC += mali_kbase_regs_dump_debugfs.c
--endif
-+#
-+# Kernel Modules
-+#
-+obj-$(CONFIG_MALI_MIDGARD) += mali_kbase.o
-+obj-$(CONFIG_MALI_ARBITRATION) += arbitration/
-+obj-$(CONFIG_MALI_KUTF)    += tests/
-+
-+mali_kbase-y := \
-+    mali_kbase_cache_policy.o \
-+    mali_kbase_ccswe.o \
-+    mali_kbase_mem.o \
-+    mali_kbase_mem_pool_group.o \
-+    mali_kbase_native_mgm.o \
-+    mali_kbase_ctx_sched.o \
-+    mali_kbase_gpuprops.o \
-+    mali_kbase_pm.o \
-+    mali_kbase_config.o \
-+    mali_kbase_vinstr.o \
-+    mali_kbase_hwcnt.o \
-+    mali_kbase_hwcnt_gpu.o \
-+    mali_kbase_hwcnt_legacy.o \
-+    mali_kbase_hwcnt_types.o \
-+    mali_kbase_hwcnt_virtualizer.o \
-+    mali_kbase_softjobs.o \
-+    mali_kbase_hw.o \
-+    mali_kbase_debug.o \
-+    mali_kbase_gpu_memory_debugfs.o \
-+    mali_kbase_mem_linux.o \
-+    mali_kbase_core_linux.o \
-+    mali_kbase_mem_profile_debugfs.o \
-+    mali_kbase_disjoint_events.o \
-+    mali_kbase_debug_mem_view.o \
-+    mali_kbase_smc.o \
-+    mali_kbase_mem_pool.o \
-+    mali_kbase_mem_pool_debugfs.o \
-+    mali_kbase_debugfs_helper.o \
-+    mali_kbase_strings.o \
-+    mali_kbase_as_fault_debugfs.o \
-+    mali_kbase_regs_history_debugfs.o \
-+    mali_kbase_dvfs_debugfs.o \
-+    mali_power_gpu_frequency_trace.o \
-+    mali_kbase_trace_gpu_mem.o
-+
-+mali_kbase-$(CONFIG_MALI_CINSTR_GWT) += mali_kbase_gwt.o
- 
-+mali_kbase-$(CONFIG_SYNC) += \
-+    mali_kbase_sync_android.o \
-+    mali_kbase_sync_common.o
- 
--ccflags-y += -I$(KBASE_PATH) -I$(KBASE_PATH)/debug \
--	-I$(KBASE_PATH)/debug/backend
-+mali_kbase-$(CONFIG_SYNC_FILE) += \
-+    mali_kbase_fence_ops.o \
-+    mali_kbase_sync_file.o \
-+    mali_kbase_sync_common.o
-+
-+ifeq ($(CONFIG_MALI_CSF_SUPPORT),y)
-+    mali_kbase-y += \
-+        mali_kbase_hwcnt_backend_csf.o \
-+        mali_kbase_hwcnt_backend_csf_if_fw.o
-+else
-+    mali_kbase-y += \
-+        mali_kbase_jm.o \
-+        mali_kbase_hwcnt_backend_jm.o \
-+        mali_kbase_dummy_job_wa.o \
-+        mali_kbase_debug_job_fault.o \
-+        mali_kbase_event.o \
-+        mali_kbase_jd.o \
-+        mali_kbase_jd_debugfs.o \
-+        mali_kbase_js.o \
-+        mali_kbase_js_ctx_attr.o \
-+        mali_kbase_kinstr_jm.o
-+
-+    mali_kbase-$(CONFIG_MALI_DMA_FENCE) += \
-+        mali_kbase_fence_ops.o \
-+        mali_kbase_dma_fence.o \
-+        mali_kbase_fence.o
-+
-+    mali_kbase-$(CONFIG_SYNC_FILE) += \
-+        mali_kbase_fence_ops.o \
-+        mali_kbase_fence.o
-+endif
- 
--# Tell the Linux build system from which .o file to create the kernel module
--obj-$(CONFIG_MALI_MIDGARD) += mali_kbase.o
- 
--# Tell the Linux build system to enable building of our .c files
--mali_kbase-y := $(SRC:.c=.o)
-+INCLUDE_SUBDIR = \
-+    $(src)/context/Kbuild \
-+    $(src)/debug/Kbuild \
-+    $(src)/device/Kbuild \
-+    $(src)/backend/gpu/Kbuild \
-+    $(src)/mmu/Kbuild \
-+    $(src)/tl/Kbuild \
-+    $(src)/gpu/Kbuild \
-+    $(src)/thirdparty/Kbuild \
-+    $(src)/platform/$(MALI_PLATFORM_DIR)/Kbuild
- 
--# Kconfig passes in the name with quotes for in-tree builds - remove them.
--platform_name := $(shell echo $(CONFIG_MALI_PLATFORM_NAME))
--MALI_PLATFORM_DIR := platform/$(platform_name)
--ccflags-y += -I$(src)/$(MALI_PLATFORM_DIR)
--include $(src)/$(MALI_PLATFORM_DIR)/Kbuild
-+ifeq ($(CONFIG_MALI_CSF_SUPPORT),y)
-+    INCLUDE_SUBDIR += $(src)/csf/Kbuild
-+endif
- 
--ifeq ($(CONFIG_MALI_DEVFREQ),y)
--  ifeq ($(CONFIG_DEVFREQ_THERMAL),y)
--    include $(src)/ipa/Kbuild
--  endif
-+ifeq ($(CONFIG_MALI_ARBITER_SUPPORT),y)
-+    INCLUDE_SUBDIR += $(src)/arbiter/Kbuild
- endif
- 
--ifeq ($(MALI_USE_CSF),1)
--	include $(src)/csf/Kbuild
--else
--# empty
-+ifeq ($(CONFIG_MALI_DEVFREQ),y)
-+    ifeq ($(CONFIG_DEVFREQ_THERMAL),y)
-+        INCLUDE_SUBDIR += $(src)/ipa/Kbuild
-+    endif
- endif
- 
--ifeq ($(CONFIG_MALI_ARBITER_SUPPORT),y)
--	include $(src)/arbiter/Kbuild
-+ifeq ($(KBUILD_EXTMOD),)
-+# in-tree
-+    -include $(INCLUDE_SUBDIR)
- else
--# empty
-+# out-of-tree
-+    include $(INCLUDE_SUBDIR)
- endif
--
--mali_kbase-$(CONFIG_MALI_DMA_FENCE) += \
--	mali_kbase_dma_fence.o \
--	mali_kbase_fence.o
--mali_kbase-$(CONFIG_SYNC) += \
--	mali_kbase_sync_android.o \
--	mali_kbase_sync_common.o
--mali_kbase-$(CONFIG_SYNC_FILE) += \
--	mali_kbase_sync_file.o \
--	mali_kbase_sync_common.o \
--	mali_kbase_fence.o
--
--include  $(src)/backend/gpu/Kbuild
--mali_kbase-y += $(BACKEND:.c=.o)
--
--
--ccflags-y += -I$(src)/backend/gpu
--subdir-ccflags-y += -I$(src)/backend/gpu
--
--# For kutf and mali_kutf_irq_latency_test
--obj-$(CONFIG_MALI_KUTF) += tests/
-diff --git a/dvalin/kernel/drivers/gpu/arm/midgard/Kconfig b/dvalin/kernel/drivers/gpu/arm/midgard/Kconfig
-index ca59dbb..5541383 100644
---- a/dvalin/kernel/drivers/gpu/arm/midgard/Kconfig
-+++ b/dvalin/kernel/drivers/gpu/arm/midgard/Kconfig
-@@ -1,10 +1,11 @@
-+# SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note
- #
--# (C) COPYRIGHT 2012-2020 ARM Limited. All rights reserved.
-+# (C) COPYRIGHT 2012-2021 ARM Limited. All rights reserved.
- #
- # This program is free software and is provided to you under the terms of the
- # GNU General Public License version 2 as published by the Free Software
- # Foundation, and any use by you of this program is subject to the terms
--# of such GNU licence.
-+# of such GNU license.
- #
- # This program is distributed in the hope that it will be useful,
- # but WITHOUT ANY WARRANTY; without even the implied warranty of
-@@ -15,15 +16,14 @@
- # along with this program; if not, you can access it online at
- # http://www.gnu.org/licenses/gpl-2.0.html.
- #
--# SPDX-License-Identifier: GPL-2.0
- #
--#
--
- 
- menuconfig MALI_MIDGARD
- 	tristate "Mali Midgard series support"
- 	select GPU_TRACEPOINTS if ANDROID
- 	select DMA_SHARED_BUFFER
-+	select PM_DEVFREQ
-+	select DEVFREQ_THERMAL
- 	default n
- 	help
- 	  Enable this option to build support for a ARM Mali Midgard GPU.
-@@ -31,13 +31,43 @@ menuconfig MALI_MIDGARD
- 	  To compile this driver as a module, choose M here:
- 	  this will generate a single module, called mali_kbase.
- 
--config MALI_GATOR_SUPPORT
--	bool "Enable Streamline tracing support"
-+if MALI_MIDGARD
-+
-+config MALI_PLATFORM_NAME
- 	depends on MALI_MIDGARD
-+	string "Platform name"
-+	default "devicetree"
-+	help
-+	  Enter the name of the desired platform configuration directory to
-+	  include in the build. 'platform/$(MALI_PLATFORM_NAME)/Makefile' must
-+	  exist.
-+
-+config MALI_REAL_HW
-+	depends on MALI_MIDGARD
-+	def_bool !MALI_NO_MALI
-+
-+menu "Platform specific options"
-+source "drivers/gpu/arm/midgard/platform/Kconfig"
-+endmenu
-+
-+config MALI_CSF_SUPPORT
-+	bool "Enable Mali CSF based GPU support"
-+	depends on MALI_MIDGARD=m
-+	default n
-+	help
-+	  Enables support for CSF based GPUs.
-+
-+config MALI_DEVFREQ
-+	bool "Enable devfreq support for Mali"
-+	depends on MALI_MIDGARD && PM_DEVFREQ
-+	select DEVFREQ_GOV_SIMPLE_ONDEMAND
- 	default y
- 	help
--	  Enables kbase tracing used by the Arm Streamline Performance Analyzer.
--	  The tracepoints are used to derive GPU activity charts in Streamline.
-+	  Support devfreq for Mali.
-+
-+	  Using the devfreq framework and, by default, the simple on-demand
-+	  governor, the frequency of Mali will be dynamically selected from the
-+	  available OPPs.
- 
- config MALI_MIDGARD_DVFS
- 	bool "Enable legacy DVFS"
-@@ -46,28 +76,25 @@ config MALI_MIDGARD_DVFS
- 	help
- 	  Choose this option to enable legacy DVFS in the Mali Midgard DDK.
- 
-+config MALI_GATOR_SUPPORT
-+	bool "Enable Streamline tracing support"
-+	depends on MALI_MIDGARD
-+	default y
-+	help
-+	  Enables kbase tracing used by the Arm Streamline Performance Analyzer.
-+	  The tracepoints are used to derive GPU activity charts in Streamline.
-+
- config MALI_MIDGARD_ENABLE_TRACE
- 	bool "Enable kbase tracing"
- 	depends on MALI_MIDGARD
- 	default y if MALI_DEBUG
- 	default n
- 	help
--	  Enables tracing in kbase.  Trace log available through
-+	  Enables tracing in kbase. Trace log available through
- 	  the "mali_trace" debugfs file, when the CONFIG_DEBUG_FS is enabled
- 
--config MALI_DEVFREQ
--	bool "devfreq support for Mali"
--	depends on MALI_MIDGARD && PM_DEVFREQ
--	default y
--	help
--	  Support devfreq for Mali.
--
--	  Using the devfreq framework and, by default, the simpleondemand
--	  governor, the frequency of Mali will be dynamically selected from the
--	  available OPPs.
--
- config MALI_DMA_FENCE
--	bool "DMA_BUF fence support for Mali"
-+	bool "Enable DMA_BUF fence support for Mali"
- 	depends on MALI_MIDGARD
- 	default n
- 	help
-@@ -76,18 +103,9 @@ config MALI_DMA_FENCE
- 	  This option should only be enabled if the Linux Kernel has built in
- 	  support for DMA_BUF fences.
- 
--config MALI_PLATFORM_NAME
--	depends on MALI_MIDGARD
--	string "Platform name"
--	default "devicetree"
--	help
--	  Enter the name of the desired platform configuration directory to
--	  include in the build. 'platform/$(MALI_PLATFORM_NAME)/Kbuild' must
--	  exist.
--
- config MALI_ARBITER_SUPPORT
- 	bool "Enable arbiter support for Mali"
--	depends on MALI_MIDGARD
-+	depends on MALI_MIDGARD && !MALI_CSF_SUPPORT
- 	default n
- 	help
- 	  Enable support for the arbiter interface in the driver.
-@@ -96,18 +114,64 @@ config MALI_ARBITER_SUPPORT
- 
- 	  If unsure, say N.
- 
--# MALI_EXPERT configuration options
-+config MALI_DMA_BUF_MAP_ON_DEMAND
-+	bool "Enable map imported dma-bufs on demand"
-+	depends on MALI_MIDGARD
-+	default n
-+	help
-+	  This option caused kbase to set up the GPU mapping of imported
-+	  dma-buf when needed to run atoms. This is the legacy behavior.
-+
-+	  This is intended for testing and the option will get removed in the
-+	  future.
-+
-+config MALI_DMA_BUF_LEGACY_COMPAT
-+	bool "Enable legacy compatibility cache flush on dma-buf map"
-+	depends on MALI_MIDGARD && !MALI_DMA_BUF_MAP_ON_DEMAND
-+	default n
-+	help
-+	  This option enables compatibility with legacy dma-buf mapping
-+	  behavior, then the dma-buf is mapped on import, by adding cache
-+	  maintenance where MALI_DMA_BUF_MAP_ON_DEMAND would do the mapping,
-+	  including a cache flush.
-+
-+	  This option might work-around issues related to missing cache
-+	  flushes in other drivers. This only has an effect for clients using
-+	  UK 11.18 or older. For later UK versions it is not possible.
- 
- menuconfig MALI_EXPERT
- 	depends on MALI_MIDGARD
- 	bool "Enable Expert Settings"
- 	default n
- 	help
--	  Enabling this option and modifying the default settings may produce a driver with performance or
--	  other limitations.
-+	  Enabling this option and modifying the default settings may produce
-+	  a driver with performance or other limitations.
-+
-+if MALI_EXPERT
-+
-+config MALI_2MB_ALLOC
-+	bool "Attempt to allocate 2MB pages"
-+	depends on MALI_MIDGARD && MALI_EXPERT
-+	default n
-+	help
-+	  Rather than allocating all GPU memory page-by-page, attempt to
-+	  allocate 2MB pages from the kernel. This reduces TLB pressure and
-+	  helps to prevent memory fragmentation.
-+
-+	  If in doubt, say N
-+
-+config MALI_MEMORY_FULLY_BACKED
-+	bool "Enable memory fully physically-backed"
-+	depends on MALI_MIDGARD && MALI_EXPERT
-+	default n
-+	help
-+	  This option enables full physical backing of all virtual
-+	  memory allocations in the kernel. Notice that this build
-+	  option only affects allocations of grow-on-GPU-page-fault
-+	  memory.
- 
- config MALI_CORESTACK
--	bool "Support controlling power to the GPU core stack"
-+	bool "Enable support of GPU core stack power control"
- 	depends on MALI_MIDGARD && MALI_EXPERT
- 	default n
- 	help
-@@ -119,15 +183,48 @@ config MALI_CORESTACK
- 
- 	  If unsure, say N.
- 
-+comment "Platform options"
-+	depends on MALI_MIDGARD && MALI_EXPERT
-+
-+config MALI_NO_MALI
-+	bool "Enable No Mali"
-+	depends on MALI_MIDGARD && MALI_EXPERT
-+	default n
-+	help
-+	  This can be used to test the driver in a simulated environment
-+	  whereby the hardware is not physically present. If the hardware is physically
-+	  present it will not be used. This can be used to test the majority of the
-+	  driver without needing actual hardware or for software benchmarking.
-+	  All calls to the simulated hardware will complete immediately as if the hardware
-+	  completed the task.
-+
-+config MALI_ERROR_INJECT
-+	bool "Enable No Mali error injection"
-+	depends on MALI_MIDGARD && MALI_EXPERT && MALI_NO_MALI
-+	default n
-+	help
-+	  Enables insertion of errors to test module failure and recovery mechanisms.
-+
-+config MALI_GEM5_BUILD
-+	bool "Enable build of Mali kernel driver for GEM5"
-+	depends on MALI_MIDGARD && MALI_EXPERT
-+	default n
-+	help
-+	  This option is to do a Mali GEM5 build.
-+	  If unsure, say N.
-+
-+comment "Debug options"
-+	depends on MALI_MIDGARD && MALI_EXPERT
-+
- config MALI_DEBUG
--	bool "Debug build"
-+	bool "Enable debug build"
- 	depends on MALI_MIDGARD && MALI_EXPERT
- 	default n
- 	help
- 	  Select this option for increased checking and reporting of errors.
- 
- config MALI_FENCE_DEBUG
--	bool "Debug sync fence usage"
-+	bool "Enable debug sync fence usage"
- 	depends on MALI_MIDGARD && MALI_EXPERT && (SYNC || SYNC_FILE)
- 	default y if MALI_DEBUG
- 	help
-@@ -143,28 +240,6 @@ config MALI_FENCE_DEBUG
- 	  The timeout can be changed at runtime through the js_soft_timeout
- 	  device attribute, where the timeout is specified in milliseconds.
- 
--config MALI_NO_MALI
--	bool "No Mali"
--	depends on MALI_MIDGARD && MALI_EXPERT
--	default n
--	help
--	  This can be used to test the driver in a simulated environment
--	  whereby the hardware is not physically present. If the hardware is physically
--	  present it will not be used. This can be used to test the majority of the
--	  driver without needing actual hardware or for software benchmarking.
--	  All calls to the simulated hardware will complete immediately as if the hardware
--	  completed the task.
--
--config MALI_REAL_HW
--	def_bool !MALI_NO_MALI
--
--config MALI_ERROR_INJECT
--	bool "Error injection"
--	depends on MALI_MIDGARD && MALI_EXPERT && MALI_NO_MALI
--	default n
--	help
--	  Enables insertion of errors to test module failure and recovery mechanisms.
--
- config MALI_SYSTEM_TRACE
- 	bool "Enable system event tracing support"
- 	depends on MALI_MIDGARD && MALI_EXPERT
-@@ -176,63 +251,93 @@ config MALI_SYSTEM_TRACE
- 	  minimal overhead when not in use. Enable only if you know what
- 	  you are doing.
- 
--config MALI_2MB_ALLOC
--	bool "Attempt to allocate 2MB pages"
-+comment "Instrumentation options"
- 	depends on MALI_MIDGARD && MALI_EXPERT
--	default n
--	help
--	  Rather than allocating all GPU memory page-by-page, attempt to
--	  allocate 2MB pages from the kernel. This reduces TLB pressure and
--	  helps to prevent memory fragmentation.
- 
--	  If in doubt, say N
-+choice
-+	prompt "Select Performance counters set"
-+	default MALI_PRFCNT_SET_PRIMARY
-+	depends on MALI_MIDGARD && MALI_EXPERT
- 
--config MALI_PWRSOFT_765
--	bool "PWRSOFT-765 ticket"
-+config MALI_PRFCNT_SET_PRIMARY
-+	bool "Primary"
- 	depends on MALI_MIDGARD && MALI_EXPERT
--	default n
- 	help
--	  PWRSOFT-765 fixes devfreq cooling devices issues. The fix was merged
--	  in kernel v4.10, however if backported into the kernel then this
--	  option must be manually selected.
-+	  Select this option to use primary set of performance counters.
- 
--	  If using kernel >= v4.10 then say N, otherwise if devfreq cooling
--	  changes have been backported say Y to avoid compilation errors.
-+config MALI_PRFCNT_SET_SECONDARY
-+	bool "Secondary"
-+	depends on MALI_MIDGARD && MALI_EXPERT
-+	help
-+	  Select this option to use secondary set of performance counters. Kernel
-+	  features that depend on an access to the primary set of counters may
-+	  become unavailable. Enabling this option will prevent power management
-+	  from working optimally and may cause instrumentation tools to return
-+	  bogus results.
- 
--config MALI_MEMORY_FULLY_BACKED
--	bool "Memory fully physically-backed"
-+	  If unsure, use MALI_PRFCNT_SET_PRIMARY.
-+
-+config MALI_PRFCNT_SET_TERTIARY
-+	bool "Tertiary"
- 	depends on MALI_MIDGARD && MALI_EXPERT
-+	help
-+	  Select this option to use tertiary set of performance counters. Kernel
-+	  features that depend on an access to the primary set of counters may
-+	  become unavailable. Enabling this option will prevent power management
-+	  from working optimally and may cause instrumentation tools to return
-+	  bogus results.
-+
-+	  If unsure, use MALI_PRFCNT_SET_PRIMARY.
-+
-+endchoice
-+
-+config MALI_PRFCNT_SET_SELECT_VIA_DEBUG_FS
-+	bool "Enable runtime selection of performance counters set via debugfs"
-+	depends on MALI_MIDGARD && MALI_EXPERT && DEBUG_FS
- 	default n
- 	help
--	  This option enables full physical backing of all virtual
--	  memory allocations in the kernel. Notice that this build
--	  option only affects allocations of grow-on-GPU-page-fault
--	  memory.
-+	  Select this option to make the secondary set of performance counters
-+	  available at runtime via debugfs. Kernel features that depend on an
-+	  access to the primary set of counters may become unavailable.
- 
--config MALI_DMA_BUF_MAP_ON_DEMAND
--	bool "Map imported dma-bufs on demand"
--	depends on MALI_MIDGARD
-+	  If no runtime debugfs option is set, the build time counter set
-+	  choice will be used.
-+
-+	  This feature is unsupported and unstable, and may break at any time.
-+	  Enabling this option will prevent power management from working
-+	  optimally and may cause instrumentation tools to return bogus results.
-+
-+	  No validation is done on the debugfs input. Invalid input could cause
-+	  performance counter errors. Valid inputs are the values accepted by
-+	  the SET_SELECT bits of the PRFCNT_CONFIG register as defined in the
-+	  architecture specification.
-+
-+	  If unsure, say N.
-+
-+config MALI_JOB_DUMP
-+	bool "Enable system level support needed for job dumping"
-+	depends on MALI_MIDGARD && MALI_EXPERT
- 	default n
- 	help
--	  This option caused kbase to set up the GPU mapping of imported
--	  dma-buf when needed to run atoms.  This is the legacy behaviour.
-+	  Choose this option to enable system level support needed for
-+	  job dumping. This is typically used for instrumentation but has
-+	  minimal overhead when not in use. Enable only if you know what
-+	  you are doing.
- 
--	  This is intended for testing and the option will get removed in the
--	  future.
-+comment "Workarounds"
-+	depends on MALI_MIDGARD && MALI_EXPERT
- 
--config MALI_DMA_BUF_LEGACY_COMPAT
--	bool "Enable legacy compatibility cache flush on dma-buf map"
--	depends on MALI_MIDGARD && !MALI_DMA_BUF_MAP_ON_DEMAND
-+config MALI_PWRSOFT_765
-+	bool "Enable workaround for PWRSOFT-765"
-+	depends on MALI_MIDGARD && MALI_EXPERT
- 	default n
- 	help
--	  This option enables compatibility with legacy dma-buf mapping
--	  behavior, then the dma-buf is mapped on import, by adding cache
--	  maintenance where MALI_DMA_BUF_MAP_ON_DEMAND would do the mapping,
--	  including a cache flush.
-+	  PWRSOFT-765 fixes devfreq cooling devices issues. The fix was merged
-+	  in kernel v4.10, however if backported into the kernel then this
-+	  option must be manually selected.
- 
--	  This option might work-around issues related to missing cache
--	  flushes in other drivers. This only has an effect for clients using
--	  UK 11.18 or older. For later UK versions it is not possible.
-+	  If using kernel >= v4.10 then say N, otherwise if devfreq cooling
-+	  changes have been backported say Y to avoid compilation errors.
- 
- config MALI_HW_ERRATA_1485982_NOT_AFFECTED
- 	bool "Disable workaround for BASE_HW_ISSUE_GPU2017_1336"
-@@ -252,58 +357,22 @@ config MALI_HW_ERRATA_1485982_USE_CLOCK_ALTERNATIVE
- 	default n
- 	help
- 	  This option uses an alternative workaround for GPU2017-1336. Lowering
--	  the GPU clock to a, platform specific, known good frequeuncy before
-+	  the GPU clock to a, platform specific, known good frequency before
- 	  powering down the L2 cache. The clock can be specified in the device
- 	  tree using the property, opp-mali-errata-1485982. Otherwise the
- 	  slowest clock will be selected.
- 
--config MALI_GEM5_BUILD
--	bool "Enable build of Mali kernel driver for GEM5"
--	depends on MALI_MIDGARD
--	default n
--	help
--	  This option is to do a Mali GEM5 build.
--	  If unsure, say N.
--
--# Instrumentation options.
-+endif
- 
--config MALI_JOB_DUMP
--	bool "Enable system level support needed for job dumping"
--	depends on MALI_MIDGARD && MALI_EXPERT
--	default n
--	help
--	  Choose this option to enable system level support needed for
--	  job dumping. This is typically used for instrumentation but has
--	  minimal overhead when not in use. Enable only if you know what
--	  you are doing.
--
--config MALI_PRFCNT_SET_SECONDARY
--	bool "Use secondary set of performance counters"
--	depends on MALI_MIDGARD && MALI_EXPERT
--	default n
--	help
--	  Select this option to use secondary set of performance counters. Kernel
--	  features that depend on an access to the primary set of counters may
--	  become unavailable. Enabling this option will prevent power management
--	  from working optimally and may cause instrumentation tools to return
--	  bogus results.
--
--	  If unsure, say N.
--
--config MALI_PRFCNT_SET_SECONDARY_VIA_DEBUG_FS
--	bool "Use secondary set of performance counters"
--	depends on MALI_MIDGARD && MALI_EXPERT && !MALI_PRFCNT_SET_SECONDARY && DEBUG_FS
-+config MALI_ARBITRATION
-+	bool "Enable Virtualization reference code"
-+	depends on MALI_MIDGARD
- 	default n
- 	help
--	  Select this option to make the secondary set of performance counters
--	  available at runtime via debugfs. Kernel features that depend on an
--	  access to the primary set of counters may become unavailable.
--
--	  This feature is unsupported and unstable, and may break at any time.
--	  Enabling this option will prevent power management from working
--	  optimally and may cause instrumentation tools to return bogus results.
--
-+	  Enables the build of several reference modules used in the reference
-+	  virtualization setup for Mali
- 	  If unsure, say N.
- 
--source "drivers/gpu/arm/midgard/platform/Kconfig"
- source "drivers/gpu/arm/midgard/tests/Kconfig"
-+
-+endif
-diff --git a/dvalin/kernel/drivers/gpu/arm/midgard/Makefile b/dvalin/kernel/drivers/gpu/arm/midgard/Makefile
-index 53a1209..4384e80 100644
---- a/dvalin/kernel/drivers/gpu/arm/midgard/Makefile
-+++ b/dvalin/kernel/drivers/gpu/arm/midgard/Makefile
-@@ -1,10 +1,11 @@
-+# SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note
- #
--# (C) COPYRIGHT 2010-2019 ARM Limited. All rights reserved.
-+# (C) COPYRIGHT 2010-2021 ARM Limited. All rights reserved.
- #
- # This program is free software and is provided to you under the terms of the
- # GNU General Public License version 2 as published by the Free Software
- # Foundation, and any use by you of this program is subject to the terms
--# of such GNU licence.
-+# of such GNU license.
- #
- # This program is distributed in the hope that it will be useful,
- # but WITHOUT ANY WARRANTY; without even the implied warranty of
-@@ -15,24 +16,200 @@
- # along with this program; if not, you can access it online at
- # http://www.gnu.org/licenses/gpl-2.0.html.
- #
--# SPDX-License-Identifier: GPL-2.0
- #
-+
-+KERNEL_SRC ?= /lib/modules/$(shell uname -r)/build
-+KDIR ?= $(KERNEL_SRC)
-+
-+ifeq ($(KDIR),)
-+    $(error Must specify KDIR to point to the kernel to target))
-+endif
-+
-+#
-+# Default configuration values
-+#
-+# Dependency resolution is done through statements as Kconfig
-+# is not supported for out-of-tree builds.
- #
- 
-+CONFIG_MALI_MIDGARD ?= m
-+ifeq ($(CONFIG_MALI_MIDGARD),m)
-+    CONFIG_MALI_GATOR_SUPPORT ?= y
-+    CONFIG_MALI_ARBITRATION ?= n
-+    CONFIG_MALI_PARTITION_MANAGER ?= n
-+
-+    ifneq ($(CONFIG_MALI_NO_MALI),y)
-+        # Prevent misuse when CONFIG_MALI_NO_MALI=y
-+        CONFIG_MALI_REAL_HW ?= y
-+    endif
-+
-+    ifeq ($(CONFIG_MALI_MIDGARD_DVFS),y)
-+        # Prevent misuse when CONFIG_MALI_MIDGARD_DVFS=y
-+        CONFIG_MALI_DEVFREQ ?= n
-+    else
-+        CONFIG_MALI_DEVFREQ ?= y
-+    endif
-+
-+    ifeq ($(CONFIG_MALI_DMA_BUF_MAP_ON_DEMAND), y)
-+        # Prevent misuse when CONFIG_MALI_DMA_BUF_MAP_ON_DEMAND=y
-+        CONFIG_MALI_DMA_BUF_LEGACY_COMPAT = n
-+    endif
-+
-+    ifeq ($(CONFIG_BSP_HAS_HYPERVISOR),y)
-+        ifneq ($(CONFIG_MALI_ARBITRATION), n)
-+            CONFIG_MALI_XEN ?= m
-+        endif
-+    endif
-+
-+    #
-+    # Expert/Debug/Test released configurations
-+    #
-+    ifeq ($(CONFIG_MALI_EXPERT), y)
-+        ifeq ($(CONFIG_MALI_NO_MALI), y)
-+            CONFIG_MALI_REAL_HW = n
-+        else
-+            # Prevent misuse when CONFIG_MALI_NO_MALI=n
-+            CONFIG_MALI_REAL_HW = y
-+            CONFIG_MALI_ERROR_INJECT = n
-+        endif
-+
-+        ifeq ($(CONFIG_MALI_HW_ERRATA_1485982_NOT_AFFECTED), y)
-+            # Prevent misuse when CONFIG_MALI_HW_ERRATA_1485982_NOT_AFFECTED=y
-+            CONFIG_MALI_HW_ERRATA_1485982_USE_CLOCK_ALTERNATIVE = n
-+        endif
- 
--KDIR ?= /lib/modules/$(shell uname -r)/build
-+        ifeq ($(CONFIG_MALI_DEBUG), y)
-+            CONFIG_MALI_MIDGARD_ENABLE_TRACE ?= y
-+            CONFIG_MALI_SYSTEM_TRACE ?= y
- 
--BUSLOG_PATH_RELATIVE = $(CURDIR)/../../../..
--KBASE_PATH_RELATIVE = $(CURDIR)
-+            ifeq ($(CONFIG_SYNC), y)
-+                CONFIG_MALI_FENCE_DEBUG ?= y
-+            else
-+                ifeq ($(CONFIG_SYNC_FILE), y)
-+                    CONFIG_MALI_FENCE_DEBUG ?= y
-+                else
-+                    CONFIG_MALI_FENCE_DEBUG = n
-+                endif
-+            endif
-+        else
-+            # Prevent misuse when CONFIG_MALI_DEBUG=n
-+            CONFIG_MALI_MIDGARD_ENABLE_TRACE = n
-+            CONFIG_MALI_SYSTEM_TRACE = n
-+            CONFIG_MALI_FENCE_DEBUG = n
-+        endif
-+    else
-+        # Prevent misuse when CONFIG_MALI_EXPERT=n
-+        CONFIG_MALI_CORESTACK = n
-+        CONFIG_MALI_2MB_ALLOC = n
-+        CONFIG_MALI_PWRSOFT_765 = n
-+        CONFIG_MALI_MEMORY_FULLY_BACKED = n
-+        CONFIG_MALI_JOB_DUMP = n
-+        CONFIG_MALI_NO_MALI = n
-+        CONFIG_MALI_REAL_HW = y
-+        CONFIG_MALI_ERROR_INJECT = n
-+        CONFIG_MALI_HW_ERRATA_1485982_NOT_AFFECTED = n
-+        CONFIG_MALI_HW_ERRATA_1485982_USE_CLOCK_ALTERNATIVE = n
-+        CONFIG_MALI_PRFCNT_SET_SELECT_VIA_DEBUG_FS = n
-+        CONFIG_MALI_DEBUG = n
-+        CONFIG_MALI_MIDGARD_ENABLE_TRACE = n
-+        CONFIG_MALI_SYSTEM_TRACE = n
-+        CONFIG_MALI_FENCE_DEBUG = n
-+    endif
- 
--ifeq ($(CONFIG_MALI_BUSLOG),y)
--#Add bus logger symbols
--EXTRA_SYMBOLS += $(BUSLOG_PATH_RELATIVE)/drivers/base/bus_logger/Module.symvers
-+    ifeq ($(CONFIG_MALI_DEBUG), y)
-+        CONFIG_MALI_KUTF ?= y
-+        ifeq ($(CONFIG_MALI_KUTF), y)
-+            CONFIG_MALI_KUTF_IRQ_TEST ?= y
-+            CONFIG_MALI_KUTF_CLK_RATE_TRACE ?= y
-+        else
-+            # Prevent misuse when CONFIG_MALI_KUTF=n
-+            CONFIG_MALI_KUTF_IRQ_TEST = n
-+            CONFIG_MALI_KUTF_CLK_RATE_TRACE = n
-+        endif
-+    else
-+        # Prevent misuse when CONFIG_MALI_DEBUG=n
-+        CONFIG_MALI_KUTF = n
-+        CONFIG_MALI_KUTF_IRQ_TEST = n
-+        CONFIG_MALI_KUTF_CLK_RATE_TRACE = n
-+    endif
-+else
-+    # Prevent misuse when CONFIG_MALI_MIDGARD=n
-+    CONFIG_MALI_ARBITRATION = n
-+    CONFIG_MALI_KUTF = n
-+    CONFIG_MALI_KUTF_IRQ_TEST = n
-+    CONFIG_MALI_KUTF_CLK_RATE_TRACE = n
- endif
- 
--# we get the symbols from modules using KBUILD_EXTRA_SYMBOLS to prevent warnings about unknown functions
-+# All Mali CONFIG should be listed here
-+CONFIGS := \
-+    CONFIG_MALI_MIDGARD \
-+    CONFIG_MALI_CSF_SUPPORT \
-+    CONFIG_MALI_GATOR_SUPPORT \
-+    CONFIG_MALI_DMA_FENCE \
-+    CONFIG_MALI_ARBITER_SUPPORT \
-+    CONFIG_MALI_ARBITRATION \
-+    CONFIG_MALI_PARTITION_MANAGER \
-+    CONFIG_MALI_REAL_HW \
-+    CONFIG_MALI_GEM5_BUILD \
-+    CONFIG_MALI_DEVFREQ \
-+    CONFIG_MALI_MIDGARD_DVFS \
-+    CONFIG_MALI_DMA_BUF_MAP_ON_DEMAND \
-+    CONFIG_MALI_DMA_BUF_LEGACY_COMPAT \
-+    CONFIG_MALI_EXPERT \
-+    CONFIG_MALI_CORESTACK \
-+    CONFIG_MALI_2MB_ALLOC \
-+    CONFIG_MALI_PWRSOFT_765 \
-+    CONFIG_MALI_MEMORY_FULLY_BACKED \
-+    CONFIG_MALI_JOB_DUMP \
-+    CONFIG_MALI_NO_MALI \
-+    CONFIG_MALI_ERROR_INJECT \
-+    CONFIG_MALI_HW_ERRATA_1485982_NOT_AFFECTED \
-+    CONFIG_MALI_HW_ERRATA_1485982_USE_CLOCK_ALTERNATIVE \
-+    CONFIG_MALI_PRFCNT_SET_PRIMARY \
-+    CONFIG_MALI_PRFCNT_SET_SECONDARY \
-+    CONFIG_MALI_PRFCNT_SET_TERTIARY \
-+    CONFIG_MALI_PRFCNT_SET_SELECT_VIA_DEBUG_FS \
-+    CONFIG_MALI_DEBUG \
-+    CONFIG_MALI_MIDGARD_ENABLE_TRACE \
-+    CONFIG_MALI_SYSTEM_TRACE \
-+    CONFIG_MALI_FENCE_DEBUG \
-+    CONFIG_MALI_KUTF \
-+    CONFIG_MALI_KUTF_IRQ_TEST \
-+    CONFIG_MALI_KUTF_CLK_RATE_TRACE \
-+    CONFIG_MALI_XEN
-+
-+
-+#
-+# MAKE_ARGS to pass the custom CONFIGs on out-of-tree build
-+#
-+# Generate the list of CONFIGs and values.
-+# $(value config) is the name of the CONFIG option.
-+# $(value $(value config)) is its value (y, m).
-+# When the CONFIG is not set to y or m, it defaults to n.
-+MAKE_ARGS := $(foreach config,$(CONFIGS), \
-+                    $(if $(filter y m,$(value $(value config))), \
-+                        $(value config)=$(value $(value config)), \
-+                        $(value config)=n))
-+
-+#
-+# EXTRA_CFLAGS to define the custom CONFIGs on out-of-tree build
-+#
-+# Generate the list of CONFIGs defines with values from CONFIGS.
-+# $(value config) is the name of the CONFIG option.
-+# When set to y or m, the CONFIG gets defined to 1.
-+EXTRA_CFLAGS := $(foreach config,$(CONFIGS), \
-+                    $(if $(filter y m,$(value $(value config))), \
-+                        -D$(value config)=1))
-+
-+#
-+# KBUILD_EXTRA_SYMBOLS to prevent warnings about unknown functions
-+#
-+
- all:
--	$(MAKE) -C $(KDIR) M=$(CURDIR) EXTRA_CFLAGS="-I$(CURDIR)/../../../../include -I$(CURDIR)/../../../../tests/include $(SCONS_CFLAGS)" $(SCONS_CONFIGS) KBUILD_EXTRA_SYMBOLS="$(EXTRA_SYMBOLS)" modules
-+	$(MAKE) -C $(KDIR) M=$(CURDIR) $(MAKE_ARGS) EXTRA_CFLAGS="$(EXTRA_CFLAGS)" KBUILD_EXTRA_SYMBOLS="$(EXTRA_SYMBOLS)" modules
-+
-+modules_install:
-+	$(MAKE) -C $(KDIR) M=$(CURDIR) $(MAKE_ARGS) modules_install
- 
- clean:
--	$(MAKE) -C $(KDIR) M=$(CURDIR) clean
-+	$(MAKE) -C $(KDIR) M=$(CURDIR) $(MAKE_ARGS) clean
-diff --git a/dvalin/kernel/drivers/gpu/arm/midgard/Mconfig b/dvalin/kernel/drivers/gpu/arm/midgard/Mconfig
-index b137793..d71a113 100644
---- a/dvalin/kernel/drivers/gpu/arm/midgard/Mconfig
-+++ b/dvalin/kernel/drivers/gpu/arm/midgard/Mconfig
-@@ -1,17 +1,22 @@
-+# SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note
- #
--# (C) COPYRIGHT 2012-2020 ARM Limited. All rights reserved.
-+# (C) COPYRIGHT 2012-2021 ARM Limited. All rights reserved.
- #
- # This program is free software and is provided to you under the terms of the
- # GNU General Public License version 2 as published by the Free Software
- # Foundation, and any use by you of this program is subject to the terms
--# of such GNU licence.
-+# of such GNU license.
- #
--# A copy of the licence is included with the program, and can also be obtained
--# from Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
--# Boston, MA  02110-1301, USA.
-+# This program is distributed in the hope that it will be useful,
-+# but WITHOUT ANY WARRANTY; without even the implied warranty of
-+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-+# GNU General Public License for more details.
-+#
-+# You should have received a copy of the GNU General Public License
-+# along with this program; if not, you can access it online at
-+# http://www.gnu.org/licenses/gpl-2.0.html.
- #
- #
--
- 
- menuconfig MALI_MIDGARD
- 	bool "Mali Midgard series support"
-@@ -22,13 +27,44 @@ menuconfig MALI_MIDGARD
- 	  To compile this driver as a module, choose M here:
- 	  this will generate a single module, called mali_kbase.
- 
--config MALI_GATOR_SUPPORT
--	bool "Enable Streamline tracing support"
--	depends on MALI_MIDGARD && !BACKEND_USER
-+config MALI_PLATFORM_NAME
-+	depends on MALI_MIDGARD
-+	string "Platform name"
-+	default "hisilicon" if PLATFORM_HIKEY960
-+	default "hisilicon" if PLATFORM_HIKEY970
-+	default "devicetree"
-+	help
-+	  Enter the name of the desired platform configuration directory to
-+	  include in the build. 'platform/$(MALI_PLATFORM_NAME)/Makefile' must
-+	  exist.
-+
-+	  When PLATFORM_CUSTOM is set, this needs to be set manually to
-+	  pick up the desired platform files.
-+
-+config MALI_REAL_HW
-+	bool
-+	depends on MALI_MIDGARD
- 	default y
-+	default n if NO_MALI
-+
-+config MALI_CSF_SUPPORT
-+	bool "Enable Mali CSF based GPU support"
-+	depends on MALI_MIDGARD
-+	default y if GPU_HAS_CSF
- 	help
--	  Enables kbase tracing used by the Arm Streamline Performance Analyzer.
--	  The tracepoints are used to derive GPU activity charts in Streamline.
-+	  Enables support for CSF based GPUs.
-+
-+config MALI_DEVFREQ
-+	bool "Enable devfreq support for Mali"
-+	depends on MALI_MIDGARD
-+	default y if PLATFORM_JUNO
-+	default y if PLATFORM_CUSTOM
-+	help
-+	  Support devfreq for Mali.
-+
-+	  Using the devfreq framework and, by default, the simple on-demand
-+	  governor, the frequency of Mali will be dynamically selected from the
-+	  available OPPs.
- 
- config MALI_MIDGARD_DVFS
- 	bool "Enable legacy DVFS"
-@@ -37,29 +73,25 @@ config MALI_MIDGARD_DVFS
- 	help
- 	  Choose this option to enable legacy DVFS in the Mali Midgard DDK.
- 
-+config MALI_GATOR_SUPPORT
-+	bool "Enable Streamline tracing support"
-+	depends on MALI_MIDGARD && !BACKEND_USER
-+	default y
-+	help
-+	  Enables kbase tracing used by the Arm Streamline Performance Analyzer.
-+	  The tracepoints are used to derive GPU activity charts in Streamline.
-+
- config MALI_MIDGARD_ENABLE_TRACE
- 	bool "Enable kbase tracing"
- 	depends on MALI_MIDGARD
- 	default y if MALI_DEBUG
- 	default n
- 	help
--	  Enables tracing in kbase.  Trace log available through
-+	  Enables tracing in kbase. Trace log available through
- 	  the "mali_trace" debugfs file, when the CONFIG_DEBUG_FS is enabled
- 
--config MALI_DEVFREQ
--	bool "devfreq support for Mali"
--	depends on MALI_MIDGARD
--	default y if PLATFORM_JUNO
--	default y if PLATFORM_CUSTOM
--	help
--	  Support devfreq for Mali.
--
--	  Using the devfreq framework and, by default, the simpleondemand
--	  governor, the frequency of Mali will be dynamically selected from the
--	  available OPPs.
--
- config MALI_DMA_FENCE
--	bool "DMA_BUF fence support for Mali"
-+	bool "Enable DMA_BUF fence support for Mali"
- 	depends on MALI_MIDGARD
- 	default n
- 	help
-@@ -68,23 +100,9 @@ config MALI_DMA_FENCE
- 	  This option should only be enabled if the Linux Kernel has built in
- 	  support for DMA_BUF fences.
- 
--config MALI_PLATFORM_NAME
--	depends on MALI_MIDGARD
--	string "Platform name"
--	default "hisilicon" if PLATFORM_HIKEY960
--	default "hisilicon" if PLATFORM_HIKEY970
--	default "devicetree"
--	help
--	  Enter the name of the desired platform configuration directory to
--	  include in the build. 'platform/$(MALI_PLATFORM_NAME)/Kbuild' must
--	  exist.
--
--	  When PLATFORM_CUSTOM is set, this needs to be set manually to
--	  pick up the desired platform files.
--
- config MALI_ARBITER_SUPPORT
- 	bool "Enable arbiter support for Mali"
--	depends on MALI_MIDGARD
-+	depends on MALI_MIDGARD && !MALI_CSF_SUPPORT
- 	default n
- 	help
- 	  Enable support for the arbiter interface in the driver.
-@@ -93,62 +111,89 @@ config MALI_ARBITER_SUPPORT
- 
- 	  If unsure, say N.
- 
--# MALI_EXPERT configuration options
-+config DMA_BUF_SYNC_IOCTL_SUPPORTED
-+	bool "Enable Kernel DMA buffers support DMA_BUF_IOCTL_SYNC"
-+	depends on MALI_MIDGARD && BACKEND_KERNEL
-+	default y
-+
-+config MALI_DMA_BUF_MAP_ON_DEMAND
-+	bool "Enable map imported dma-bufs on demand"
-+	depends on MALI_MIDGARD
-+	default n
-+	default y if !DMA_BUF_SYNC_IOCTL_SUPPORTED
-+	help
-+	  This option caused kbase to set up the GPU mapping of imported
-+	  dma-buf when needed to run atoms. This is the legacy behavior.
-+
-+	  This is intended for testing and the option will get removed in the
-+	  future.
-+
-+config MALI_DMA_BUF_LEGACY_COMPAT
-+	bool "Enable legacy compatibility cache flush on dma-buf map"
-+	depends on MALI_MIDGARD && !MALI_DMA_BUF_MAP_ON_DEMAND
-+	default n
-+	help
-+	  This option enables compatibility with legacy dma-buf mapping
-+	  behavior, then the dma-buf is mapped on import, by adding cache
-+	  maintenance where MALI_DMA_BUF_MAP_ON_DEMAND would do the mapping,
-+	  including a cache flush.
-+
-+	  This option might work-around issues related to missing cache
-+	  flushes in other drivers. This only has an effect for clients using
-+	  UK 11.18 or older. For later UK versions it is not possible.
- 
- menuconfig MALI_EXPERT
- 	depends on MALI_MIDGARD
- 	bool "Enable Expert Settings"
- 	default y
- 	help
--	  Enabling this option and modifying the default settings may produce a driver with performance or
--	  other limitations.
-+	  Enabling this option and modifying the default settings may produce
-+	  a driver with performance or other limitations.
- 
--config MALI_CORESTACK
--	bool "Support controlling power to the GPU core stack"
-+config MALI_2MB_ALLOC
-+	bool "Attempt to allocate 2MB pages"
- 	depends on MALI_MIDGARD && MALI_EXPERT
- 	default n
- 	help
--	  Enabling this feature on supported GPUs will let the driver powering
--	  on/off the GPU core stack independently without involving the Power
--	  Domain Controller. This should only be enabled on platforms which
--	  integration of the PDC to the Mali GPU is known to be problematic.
--	  This feature is currently only supported on t-Six and t-HEx GPUs.
-+	  Rather than allocating all GPU memory page-by-page, attempt to
-+	  allocate 2MB pages from the kernel. This reduces TLB pressure and
-+	  helps to prevent memory fragmentation.
- 
--	  If unsure, say N.
-+	  If in doubt, say N
- 
--config MALI_DEBUG
--	bool "Debug build"
-+config MALI_MEMORY_FULLY_BACKED
-+	bool "Enable memory fully physically-backed"
- 	depends on MALI_MIDGARD && MALI_EXPERT
--	default y if DEBUG
- 	default n
- 	help
--	  Select this option for increased checking and reporting of errors.
-+	  This option enables full physical backing of all virtual
-+	  memory allocations in the kernel. Notice that this build
-+	  option only affects allocations of grow-on-GPU-page-fault
-+	  memory.
- 
--config MALI_FENCE_DEBUG
--	bool "Debug sync fence usage"
-+config MALI_CORESTACK
-+	bool "Enable support of GPU core stack power control"
- 	depends on MALI_MIDGARD && MALI_EXPERT
--	default y if MALI_DEBUG
-+	default n
- 	help
--	  Select this option to enable additional checking and reporting on the
--	  use of sync fences in the Mali driver.
--
--	  This will add a 3s timeout to all sync fence waits in the Mali
--	  driver, so that when work for Mali has been waiting on a sync fence
--	  for a long time a debug message will be printed, detailing what fence
--	  is causing the block, and which dependent Mali atoms are blocked as a
--	  result of this.
-+	  Enabling this feature on supported GPUs will let the driver powering
-+	  on/off the GPU core stack independently without involving the Power
-+	  Domain Controller. This should only be enabled on platforms which
-+	  integration of the PDC to the Mali GPU is known to be problematic.
-+	  This feature is currently only supported on t-Six and t-HEx GPUs.
- 
--	  The timeout can be changed at runtime through the js_soft_timeout
--	  device attribute, where the timeout is specified in milliseconds.
-+	  If unsure, say N.
- 
- choice
- 	prompt "Error injection level"
-+	depends on MALI_MIDGARD && MALI_EXPERT
- 	default MALI_ERROR_INJECT_NONE
- 	help
- 	  Enables insertion of errors to test module failure and recovery mechanisms.
- 
- config MALI_ERROR_INJECT_NONE
- 	bool "disabled"
-+	depends on MALI_MIDGARD && MALI_EXPERT
- 	help
- 	  Error injection is disabled.
- 
-@@ -168,14 +213,49 @@ endchoice
- 
- config MALI_ERROR_INJECT_ON
- 	string
-+	depends on MALI_MIDGARD && MALI_EXPERT
- 	default "0" if MALI_ERROR_INJECT_NONE
- 	default "1" if MALI_ERROR_INJECT_TRACK_LIST
- 	default "2" if MALI_ERROR_INJECT_RANDOM
- 
- config MALI_ERROR_INJECT
- 	bool
-+	depends on MALI_MIDGARD && MALI_EXPERT
- 	default y if !MALI_ERROR_INJECT_NONE
- 
-+config MALI_GEM5_BUILD
-+	bool "Enable build of Mali kernel driver for GEM5"
-+	depends on MALI_MIDGARD && MALI_EXPERT
-+	default n
-+	help
-+	  This option is to do a Mali GEM5 build.
-+	  If unsure, say N.
-+
-+config MALI_DEBUG
-+	bool "Enable debug build"
-+	depends on MALI_MIDGARD && MALI_EXPERT
-+	default y if DEBUG
-+	default n
-+	help
-+	  Select this option for increased checking and reporting of errors.
-+
-+config MALI_FENCE_DEBUG
-+	bool "Enable debug sync fence usage"
-+	depends on MALI_MIDGARD && MALI_EXPERT
-+	default y if MALI_DEBUG
-+	help
-+	  Select this option to enable additional checking and reporting on the
-+	  use of sync fences in the Mali driver.
-+
-+	  This will add a 3s timeout to all sync fence waits in the Mali
-+	  driver, so that when work for Mali has been waiting on a sync fence
-+	  for a long time a debug message will be printed, detailing what fence
-+	  is causing the block, and which dependent Mali atoms are blocked as a
-+	  result of this.
-+
-+	  The timeout can be changed at runtime through the js_soft_timeout
-+	  device attribute, where the timeout is specified in milliseconds.
-+
- config MALI_SYSTEM_TRACE
- 	bool "Enable system event tracing support"
- 	depends on MALI_MIDGARD && MALI_EXPERT
-@@ -187,56 +267,35 @@ config MALI_SYSTEM_TRACE
- 	  minimal overhead when not in use. Enable only if you know what
- 	  you are doing.
- 
--config MALI_2MB_ALLOC
--	bool "Attempt to allocate 2MB pages"
--	depends on MALI_MIDGARD && MALI_EXPERT
--	default n
--	help
--	  Rather than allocating all GPU memory page-by-page, attempt to
--	  allocate 2MB pages from the kernel. This reduces TLB pressure and
--	  helps to prevent memory fragmentation.
-+# Instrumentation options.
- 
--	  If in doubt, say N
-+# config MALI_PRFCNT_SET_PRIMARY exists in the Kernel Kconfig but is configured using CINSTR_PRIMARY_HWC in Mconfig.
-+# config MALI_PRFCNT_SET_SECONDARY exists in the Kernel Kconfig but is configured using CINSTR_SECONDARY_HWC in Mconfig.
-+# config MALI_PRFCNT_SET_TERTIARY exists in the Kernel Kconfig but is configured using CINSTR_TERTIARY_HWC in Mconfig.
-+# config MALI_PRFCNT_SET_SELECT_VIA_DEBUG_FS exists in the Kernel Kconfig but is configured using CINSTR_HWC_SET_SELECT_VIA_DEBUG_FS in Mconfig.
- 
--config MALI_PWRSOFT_765
--	bool "PWRSOFT-765 ticket"
-+config MALI_JOB_DUMP
-+	bool "Enable system level support needed for job dumping"
- 	depends on MALI_MIDGARD && MALI_EXPERT
- 	default n
- 	help
--	  PWRSOFT-765 fixes devfreq cooling devices issues. However, they are
--	  not merged in mainline kernel yet. So this define helps to guard those
--	  parts of the code.
--
--config MALI_MEMORY_FULLY_BACKED
--	bool "Memory fully physically-backed"
--	default n
--	help
--	  This option enables full backing of all virtual memory allocations
--	  for the kernel. This only affects grow-on-GPU-page-fault memory.
-+	  Choose this option to enable system level support needed for
-+	  job dumping. This is typically used for instrumentation but has
-+	  minimal overhead when not in use. Enable only if you know what
-+	  you are doing.
- 
--config MALI_DMA_BUF_MAP_ON_DEMAND
--	bool "Map imported dma-bufs on demand"
--	depends on MALI_MIDGARD
-+config MALI_PWRSOFT_765
-+	bool "Enable workaround for PWRSOFT-765"
-+	depends on MALI_MIDGARD && MALI_EXPERT
- 	default n
--	default y if !DMA_BUF_SYNC_IOCTL_SUPPORTED
- 	help
--	  This option caused kbase to set up the GPU mapping of imported
--	  dma-buf when needed to run atoms.  This is the legacy behaviour.
-+	  PWRSOFT-765 fixes devfreq cooling devices issues. The fix was merged
-+	  in kernel v4.10, however if backported into the kernel then this
-+	  option must be manually selected.
- 
--config MALI_DMA_BUF_LEGACY_COMPAT
--	bool "Enable legacy compatibility cache flush on dma-buf map"
--	depends on MALI_MIDGARD && !MALI_DMA_BUF_MAP_ON_DEMAND
--	default n
--	help
--	  This option enables compatibility with legacy dma-buf mapping
--	  behavior, then the dma-buf is mapped on import, by adding cache
--	  maintenance where MALI_DMA_BUF_MAP_ON_DEMAND would do the mapping,
--	  including a cache flush.
-+	  If using kernel >= v4.10 then say N, otherwise if devfreq cooling
-+	  changes have been backported say Y to avoid compilation errors.
- 
--config MALI_REAL_HW
--	bool
--	default y
--	default n if NO_MALI
- 
- config MALI_HW_ERRATA_1485982_NOT_AFFECTED
- 	bool "Disable workaround for BASE_HW_ISSUE_GPU2017_1336"
-@@ -262,17 +321,6 @@ config MALI_HW_ERRATA_1485982_USE_CLOCK_ALTERNATIVE
- 	  tree using the property, opp-mali-errata-1485982. Otherwise the
- 	  slowest clock will be selected.
- 
--config MALI_GEM5_BUILD
--	bool "Enable build of Mali kernel driver for GEM5"
--	depends on MALI_MIDGARD
--	default n
--	help
--	  This option is to do a Mali GEM5 build.
--	  If unsure, say N.
--
--# Instrumentation options.
--
--# config MALI_JOB_DUMP exists in the Kernel Kconfig but is configured using CINSTR_JOB_DUMP in Mconfig.
--# config MALI_PRFCNT_SET_SECONDARY exists in the Kernel Kconfig but is configured using CINSTR_SECONDARY_HWC in Mconfig.
- 
-+source "kernel/drivers/gpu/arm/midgard/arbitration/Mconfig"
- source "kernel/drivers/gpu/arm/midgard/tests/Mconfig"
-diff --git a/dvalin/kernel/drivers/gpu/arm/midgard/arbiter/Kbuild b/dvalin/kernel/drivers/gpu/arm/midgard/arbiter/Kbuild
-index 98e47be..5203281 100644
---- a/dvalin/kernel/drivers/gpu/arm/midgard/arbiter/Kbuild
-+++ b/dvalin/kernel/drivers/gpu/arm/midgard/arbiter/Kbuild
-@@ -1,10 +1,11 @@
-+# SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note
- #
--# (C) COPYRIGHT 2019-2020 ARM Limited. All rights reserved.
-+# (C) COPYRIGHT 2019-2021 ARM Limited. All rights reserved.
- #
- # This program is free software and is provided to you under the terms of the
- # GNU General Public License version 2 as published by the Free Software
- # Foundation, and any use by you of this program is subject to the terms
--# of such GNU licence.
-+# of such GNU license.
- #
- # This program is distributed in the hope that it will be useful,
- # but WITHOUT ANY WARRANTY; without even the implied warranty of
-@@ -15,10 +16,8 @@
- # along with this program; if not, you can access it online at
- # http://www.gnu.org/licenses/gpl-2.0.html.
- #
--# SPDX-License-Identifier: GPL-2.0
--#
- #
- 
- mali_kbase-y += \
--	arbiter/mali_kbase_arbif.o \
--	arbiter/mali_kbase_arbiter_pm.o
-+    arbiter/mali_kbase_arbif.o \
-+    arbiter/mali_kbase_arbiter_pm.o
-diff --git a/dvalin/kernel/drivers/gpu/arm/midgard/arbiter/mali_kbase_arbif.c b/dvalin/kernel/drivers/gpu/arm/midgard/arbiter/mali_kbase_arbif.c
-index d193cb9..64e11ce 100644
---- a/dvalin/kernel/drivers/gpu/arm/midgard/arbiter/mali_kbase_arbif.c
-+++ b/dvalin/kernel/drivers/gpu/arm/midgard/arbiter/mali_kbase_arbif.c
-@@ -1,13 +1,12 @@
--// SPDX-License-Identifier: GPL-2.0
--
-+// SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note
- /*
-  *
-- * (C) COPYRIGHT 2019-2020 ARM Limited. All rights reserved.
-+ * (C) COPYRIGHT 2019-2021 ARM Limited. All rights reserved.
-  *
-  * This program is free software and is provided to you under the terms of the
-  * GNU General Public License version 2 as published by the Free Software
-  * Foundation, and any use by you of this program is subject to the terms
-- * of such GNU licence.
-+ * of such GNU license.
-  *
-  * This program is distributed in the hope that it will be useful,
-  * but WITHOUT ANY WARRANTY; without even the implied warranty of
-@@ -18,13 +17,10 @@
-  * along with this program; if not, you can access it online at
-  * http://www.gnu.org/licenses/gpl-2.0.html.
-  *
-- * SPDX-License-Identifier: GPL-2.0
-- *
-  */
- 
- /**
-- * @file mali_kbase_arbif.c
-- * Mali arbiter interface APIs to share GPU between Virtual Machines
-+ * DOC: Mali arbiter interface APIs to share GPU between Virtual Machines
-  */
- 
- #include <mali_kbase.h>
-@@ -34,32 +30,155 @@
- #include <linux/of_platform.h>
- #include "mali_kbase_arbiter_interface.h"
- 
-+/* Arbiter interface version against which was implemented this module */
-+#define MALI_REQUIRED_KBASE_ARBITER_INTERFACE_VERSION 5
-+#if MALI_REQUIRED_KBASE_ARBITER_INTERFACE_VERSION != \
-+			MALI_KBASE_ARBITER_INTERFACE_VERSION
-+#error "Unsupported Mali Arbiter interface version."
-+#endif
-+
-+static void on_max_config(struct device *dev, uint32_t max_l2_slices,
-+			  uint32_t max_core_mask)
-+{
-+	struct kbase_device *kbdev;
-+
-+	if (!dev) {
-+		pr_err("%s(): dev is NULL", __func__);
-+		return;
-+	}
-+
-+	kbdev = dev_get_drvdata(dev);
-+	if (!kbdev) {
-+		dev_err(dev, "%s(): kbdev is NULL", __func__);
-+		return;
-+	}
-+
-+	if (!max_l2_slices || !max_core_mask) {
-+		dev_dbg(dev,
-+			"%s(): max_config ignored as one of the fields is zero",
-+			__func__);
-+		return;
-+	}
-+
-+	/* set the max config info in the kbase device */
-+	kbase_arbiter_set_max_config(kbdev, max_l2_slices, max_core_mask);
-+}
-+
-+/**
-+ * on_update_freq() - Updates GPU clock frequency
-+ * @dev: arbiter interface device handle
-+ * @freq: GPU clock frequency value reported from arbiter
-+ *
-+ * call back function to update GPU clock frequency with
-+ * new value from arbiter
-+ */
-+static void on_update_freq(struct device *dev, uint32_t freq)
-+{
-+	struct kbase_device *kbdev;
-+
-+	if (!dev) {
-+		pr_err("%s(): dev is NULL", __func__);
-+		return;
-+	}
-+
-+	kbdev = dev_get_drvdata(dev);
-+	if (!kbdev) {
-+		dev_err(dev, "%s(): kbdev is NULL", __func__);
-+		return;
-+	}
-+
-+	kbase_arbiter_pm_update_gpu_freq(&kbdev->arb.arb_freq, freq);
-+}
-+
-+/**
-+ * on_gpu_stop() - sends KBASE_VM_GPU_STOP_EVT event on VM stop
-+ * @dev: arbiter interface device handle
-+ *
-+ * call back function to signal a GPU STOP event from arbiter interface
-+ */
- static void on_gpu_stop(struct device *dev)
- {
--	struct kbase_device *kbdev = dev_get_drvdata(dev);
-+	struct kbase_device *kbdev;
-+
-+	if (!dev) {
-+		pr_err("%s(): dev is NULL", __func__);
-+		return;
-+	}
- 
--	KBASE_TLSTREAM_TL_EVENT_ARB_STOP_REQUESTED(kbdev, kbdev);
-+	kbdev = dev_get_drvdata(dev);
-+	if (!kbdev) {
-+		dev_err(dev, "%s(): kbdev is NULL", __func__);
-+		return;
-+	}
-+
-+	KBASE_TLSTREAM_TL_ARBITER_STOP_REQUESTED(kbdev, kbdev);
- 	kbase_arbiter_pm_vm_event(kbdev, KBASE_VM_GPU_STOP_EVT);
- }
- 
-+/**
-+ * on_gpu_granted() - sends KBASE_VM_GPU_GRANTED_EVT event on GPU granted
-+ * @dev: arbiter interface device handle
-+ *
-+ * call back function to signal a GPU GRANT event from arbiter interface
-+ */
- static void on_gpu_granted(struct device *dev)
- {
--	struct kbase_device *kbdev = dev_get_drvdata(dev);
-+	struct kbase_device *kbdev;
-+
-+	if (!dev) {
-+		pr_err("%s(): dev is NULL", __func__);
-+		return;
-+	}
-+
-+	kbdev = dev_get_drvdata(dev);
-+	if (!kbdev) {
-+		dev_err(dev, "%s(): kbdev is NULL", __func__);
-+		return;
-+	}
- 
--	KBASE_TLSTREAM_TL_EVENT_ARB_GRANTED(kbdev, kbdev);
-+	KBASE_TLSTREAM_TL_ARBITER_GRANTED(kbdev, kbdev);
- 	kbase_arbiter_pm_vm_event(kbdev, KBASE_VM_GPU_GRANTED_EVT);
- }
- 
-+/**
-+ * on_gpu_lost() - sends KBASE_VM_GPU_LOST_EVT event  on GPU granted
-+ * @dev: arbiter interface device handle
-+ *
-+ * call back function to signal a GPU LOST event from arbiter interface
-+ */
- static void on_gpu_lost(struct device *dev)
- {
--	struct kbase_device *kbdev = dev_get_drvdata(dev);
-+	struct kbase_device *kbdev;
-+
-+	if (!dev) {
-+		pr_err("%s(): dev is NULL", __func__);
-+		return;
-+	}
-+
-+	kbdev = dev_get_drvdata(dev);
-+	if (!kbdev) {
-+		dev_err(dev, "%s(): kbdev is NULL", __func__);
-+		return;
-+	}
- 
- 	kbase_arbiter_pm_vm_event(kbdev, KBASE_VM_GPU_LOST_EVT);
- }
- 
-+/**
-+ * kbase_arbif_init() - Kbase Arbiter interface initialisation.
-+ * @kbdev: The kbase device structure for the device (must be a valid pointer)
-+ *
-+ * Initialise Kbase Arbiter interface and assign callback functions.
-+ *
-+ * Return:
-+ * * 0			- the interface was initialized or was not specified
-+ * *			in the device tree.
-+ * * -EFAULT		- the interface was specified but failed to initialize.
-+ * * -EPROBE_DEFER	- module dependencies are not yet available.
-+ */
- int kbase_arbif_init(struct kbase_device *kbdev)
- {
--#ifdef CONFIG_OF
-+#if IS_ENABLED(CONFIG_OF)
- 	struct arbiter_if_arb_vm_ops ops;
- 	struct arbiter_if_dev *arb_if;
- 	struct device_node *arbiter_if_node;
-@@ -100,17 +219,26 @@ int kbase_arbif_init(struct kbase_device *kbdev)
- 	ops.arb_vm_gpu_stop = on_gpu_stop;
- 	ops.arb_vm_gpu_granted = on_gpu_granted;
- 	ops.arb_vm_gpu_lost = on_gpu_lost;
-+	ops.arb_vm_max_config = on_max_config;
-+	ops.arb_vm_update_freq = on_update_freq;
-+
-+	kbdev->arb.arb_freq.arb_freq = 0;
-+	kbdev->arb.arb_freq.freq_updated = false;
-+	mutex_init(&kbdev->arb.arb_freq.arb_freq_lock);
- 
- 	/* register kbase arbiter_if callbacks */
- 	if (arb_if->vm_ops.vm_arb_register_dev) {
- 		err = arb_if->vm_ops.vm_arb_register_dev(arb_if,
- 			kbdev->dev, &ops);
- 		if (err) {
--			dev_err(kbdev->dev, "Arbiter registration failed.\n");
-+			dev_err(&pdev->dev, "Failed to register with arbiter\n");
- 			module_put(pdev->dev.driver->owner);
-+			if (err != -EPROBE_DEFER)
-+				err = -EFAULT;
- 			return err;
- 		}
- 	}
-+
- #else /* CONFIG_OF */
- 	dev_dbg(kbdev->dev, "No arbiter without Device Tree support\n");
- 	kbdev->arb.arb_dev = NULL;
-@@ -119,6 +247,12 @@ int kbase_arbif_init(struct kbase_device *kbdev)
- 	return 0;
- }
- 
-+/**
-+ * kbase_arbif_destroy() - De-init Kbase arbiter interface
-+ * @kbdev: The kbase device structure for the device (must be a valid pointer)
-+ *
-+ * De-initialise Kbase arbiter interface
-+ */
- void kbase_arbif_destroy(struct kbase_device *kbdev)
- {
- 	struct arbiter_if_dev *arb_if = kbdev->arb.arb_if;
-@@ -133,27 +267,64 @@ void kbase_arbif_destroy(struct kbase_device *kbdev)
- 	kbdev->arb.arb_dev = NULL;
- }
- 
-+/**
-+ * kbase_arbif_get_max_config() - Request max config info
-+ * @kbdev: The kbase device structure for the device (must be a valid pointer)
-+ *
-+ * call back function from arb interface to arbiter requesting max config info
-+ */
-+void kbase_arbif_get_max_config(struct kbase_device *kbdev)
-+{
-+	struct arbiter_if_dev *arb_if = kbdev->arb.arb_if;
-+
-+	if (arb_if && arb_if->vm_ops.vm_arb_get_max_config) {
-+		dev_dbg(kbdev->dev, "%s\n", __func__);
-+		arb_if->vm_ops.vm_arb_get_max_config(arb_if);
-+	}
-+}
-+
-+/**
-+ * kbase_arbif_gpu_request() - Request GPU from
-+ * @kbdev: The kbase device structure for the device (must be a valid pointer)
-+ *
-+ * call back function from arb interface to arbiter requesting GPU for VM
-+ */
- void kbase_arbif_gpu_request(struct kbase_device *kbdev)
- {
- 	struct arbiter_if_dev *arb_if = kbdev->arb.arb_if;
- 
- 	if (arb_if && arb_if->vm_ops.vm_arb_gpu_request) {
- 		dev_dbg(kbdev->dev, "%s\n", __func__);
-+		KBASE_TLSTREAM_TL_ARBITER_REQUESTED(kbdev, kbdev);
- 		arb_if->vm_ops.vm_arb_gpu_request(arb_if);
- 	}
- }
- 
-+/**
-+ * kbase_arbif_gpu_stopped() - send GPU stopped message to the arbiter
-+ * @kbdev: The kbase device structure for the device (must be a valid pointer)
-+ * @gpu_required: GPU request flag
-+ *
-+ */
- void kbase_arbif_gpu_stopped(struct kbase_device *kbdev, u8 gpu_required)
- {
- 	struct arbiter_if_dev *arb_if = kbdev->arb.arb_if;
- 
- 	if (arb_if && arb_if->vm_ops.vm_arb_gpu_stopped) {
- 		dev_dbg(kbdev->dev, "%s\n", __func__);
--		KBASE_TLSTREAM_TL_EVENT_ARB_STOPPED(kbdev, kbdev);
-+		KBASE_TLSTREAM_TL_ARBITER_STOPPED(kbdev, kbdev);
-+		if (gpu_required)
-+			KBASE_TLSTREAM_TL_ARBITER_REQUESTED(kbdev, kbdev);
- 		arb_if->vm_ops.vm_arb_gpu_stopped(arb_if, gpu_required);
- 	}
- }
- 
-+/**
-+ * kbase_arbif_gpu_active() - Sends a GPU_ACTIVE message to the Arbiter
-+ * @kbdev: The kbase device structure for the device (must be a valid pointer)
-+ *
-+ * Informs the arbiter VM is active
-+ */
- void kbase_arbif_gpu_active(struct kbase_device *kbdev)
- {
- 	struct arbiter_if_dev *arb_if = kbdev->arb.arb_if;
-@@ -164,6 +335,12 @@ void kbase_arbif_gpu_active(struct kbase_device *kbdev)
- 	}
- }
- 
-+/**
-+ * kbase_arbif_gpu_idle() - Inform the arbiter that the VM has gone idle
-+ * @kbdev: The kbase device structure for the device (must be a valid pointer)
-+ *
-+ * Informs the arbiter VM is idle
-+ */
- void kbase_arbif_gpu_idle(struct kbase_device *kbdev)
- {
- 	struct arbiter_if_dev *arb_if = kbdev->arb.arb_if;
-diff --git a/dvalin/kernel/drivers/gpu/arm/midgard/arbiter/mali_kbase_arbif.h b/dvalin/kernel/drivers/gpu/arm/midgard/arbiter/mali_kbase_arbif.h
-index e7e9de7..701ffd4 100644
---- a/dvalin/kernel/drivers/gpu/arm/midgard/arbiter/mali_kbase_arbif.h
-+++ b/dvalin/kernel/drivers/gpu/arm/midgard/arbiter/mali_kbase_arbif.h
-@@ -1,28 +1,7 @@
-+/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
- /*
-  *
-- * (C) COPYRIGHT ARM Limited. All rights reserved.
-- *
-- * This program is free software and is provided to you under the terms of the
-- * GNU General Public License version 2 as published by the Free Software
-- * Foundation, and any use by you of this program is subject to the terms
-- * of such GNU licence.
-- *
-- * This program is distributed in the hope that it will be useful,
-- * but WITHOUT ANY WARRANTY; without even the implied warranty of
-- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-- * GNU General Public License for more details.
-- *
-- * You should have received a copy of the GNU General Public License
-- * along with this program; if not, you can access it online at
-- * http://www.gnu.org/licenses/gpl-2.0.html.
-- *
-- * SPDX-License-Identifier: GPL-2.0
-- *
-- *//* SPDX-License-Identifier: GPL-2.0 */
--
--/*
-- *
-- * (C) COPYRIGHT 2019-2020 ARM Limited. All rights reserved.
-+ * (C) COPYRIGHT 2019-2021 ARM Limited. All rights reserved.
-  *
-  * This program is free software and is provided to you under the terms of the
-  * GNU General Public License version 2 as published by the Free Software
-@@ -38,12 +17,10 @@
-  * along with this program; if not, you can access it online at
-  * http://www.gnu.org/licenses/gpl-2.0.html.
-  *
-- *
-  */
- 
- /**
-- * @file
-- * Mali arbiter interface APIs to share GPU between Virtual Machines
-+ * DOC: Mali arbiter interface APIs to share GPU between Virtual Machines
-  */
- 
- #ifndef _MALI_KBASE_ARBIF_H_
-@@ -80,8 +57,11 @@ enum kbase_arbif_evt {
-  * Initialize the arbiter interface and also determines
-  * if Arbiter functionality is required.
-  *
-- * Return: 0 if the Arbiter interface was successfully initialized or the
-- *           Arbiter was not required.
-+ * Return:
-+ * * 0			- the interface was initialized or was not specified
-+ * *			in the device tree.
-+ * * -EFAULT		- the interface was specified but failed to initialize.
-+ * * -EPROBE_DEFER	- module dependencies are not yet available.
-  */
- int kbase_arbif_init(struct kbase_device *kbdev);
- 
-@@ -94,6 +74,14 @@ int kbase_arbif_init(struct kbase_device *kbdev);
-  */
- void kbase_arbif_destroy(struct kbase_device *kbdev);
- 
-+/**
-+ * kbase_arbif_get_max_config() - Request max config info
-+ * @kbdev: The kbase device structure for the device (must be a valid pointer)
-+ *
-+ * call back function from arb interface to arbiter requesting max config info
-+ */
-+void kbase_arbif_get_max_config(struct kbase_device *kbdev);
-+
- /**
-  * kbase_arbif_gpu_request() - Send GPU request message to the arbiter
-  * @kbdev: The kbase device structure for the device (must be a valid pointer)
-diff --git a/dvalin/kernel/drivers/gpu/arm/midgard/arbiter/mali_kbase_arbiter_defs.h b/dvalin/kernel/drivers/gpu/arm/midgard/arbiter/mali_kbase_arbiter_defs.h
-index 1f53cbf..570a82a 100644
---- a/dvalin/kernel/drivers/gpu/arm/midgard/arbiter/mali_kbase_arbiter_defs.h
-+++ b/dvalin/kernel/drivers/gpu/arm/midgard/arbiter/mali_kbase_arbiter_defs.h
-@@ -1,28 +1,7 @@
-+/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
- /*
-  *
-- * (C) COPYRIGHT ARM Limited. All rights reserved.
-- *
-- * This program is free software and is provided to you under the terms of the
-- * GNU General Public License version 2 as published by the Free Software
-- * Foundation, and any use by you of this program is subject to the terms
-- * of such GNU licence.
-- *
-- * This program is distributed in the hope that it will be useful,
-- * but WITHOUT ANY WARRANTY; without even the implied warranty of
-- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-- * GNU General Public License for more details.
-- *
-- * You should have received a copy of the GNU General Public License
-- * along with this program; if not, you can access it online at
-- * http://www.gnu.org/licenses/gpl-2.0.html.
-- *
-- * SPDX-License-Identifier: GPL-2.0
-- *
-- *//* SPDX-License-Identifier: GPL-2.0 */
--
--/*
-- *
-- * (C) COPYRIGHT 2019-2020 ARM Limited. All rights reserved.
-+ * (C) COPYRIGHT 2019-2021 ARM Limited. All rights reserved.
-  *
-  * This program is free software and is provided to you under the terms of the
-  * GNU General Public License version 2 as published by the Free Software
-@@ -38,7 +17,6 @@
-  * along with this program; if not, you can access it online at
-  * http://www.gnu.org/licenses/gpl-2.0.html.
-  *
-- *
-  */
- 
- /**
-@@ -66,7 +44,8 @@
-  * @vm_resume_work:  Work item for vm_arb_wq to resume current work on GPU
-  * @vm_arb_starting: Work queue resume in progress
-  * @vm_arb_stopping: Work queue suspend in progress
-- * @vm_arb_users_waiting: Count of users waiting for GPU
-+ * @interrupts_installed: Flag set when interrupts are installed
-+ * @vm_request_timer: Timer to monitor GPU request
-  */
- struct kbase_arbiter_vm_state {
- 	struct kbase_device *kbdev;
-@@ -78,7 +57,8 @@ struct kbase_arbiter_vm_state {
- 	struct work_struct vm_resume_work;
- 	bool vm_arb_starting;
- 	bool vm_arb_stopping;
--	int vm_arb_users_waiting;
-+	bool interrupts_installed;
-+	struct hrtimer vm_request_timer;
- };
- 
- /**
-@@ -86,10 +66,12 @@ struct kbase_arbiter_vm_state {
-  *                               allocated from the probe method of Mali driver
-  * @arb_if:                 Pointer to the arbiter interface device
-  * @arb_dev:                Pointer to the arbiter device
-+ * @arb_freq:               GPU clock frequency retrieved from arbiter.
-  */
- struct kbase_arbiter_device {
- 	struct arbiter_if_dev *arb_if;
- 	struct device *arb_dev;
-+	struct kbase_arbiter_freq arb_freq;
- };
- 
- #endif /* _MALI_KBASE_ARBITER_DEFS_H_ */
-diff --git a/dvalin/kernel/drivers/gpu/arm/midgard/arbiter/mali_kbase_arbiter_interface.h b/dvalin/kernel/drivers/gpu/arm/midgard/arbiter/mali_kbase_arbiter_interface.h
-index 5d5d8a7..c0137f7 100644
---- a/dvalin/kernel/drivers/gpu/arm/midgard/arbiter/mali_kbase_arbiter_interface.h
-+++ b/dvalin/kernel/drivers/gpu/arm/midgard/arbiter/mali_kbase_arbiter_interface.h
-@@ -1,28 +1,7 @@
-+/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
- /*
-  *
-- * (C) COPYRIGHT ARM Limited. All rights reserved.
-- *
-- * This program is free software and is provided to you under the terms of the
-- * GNU General Public License version 2 as published by the Free Software
-- * Foundation, and any use by you of this program is subject to the terms
-- * of such GNU licence.
-- *
-- * This program is distributed in the hope that it will be useful,
-- * but WITHOUT ANY WARRANTY; without even the implied warranty of
-- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-- * GNU General Public License for more details.
-- *
-- * You should have received a copy of the GNU General Public License
-- * along with this program; if not, you can access it online at
-- * http://www.gnu.org/licenses/gpl-2.0.html.
-- *
-- * SPDX-License-Identifier: GPL-2.0
-- *
-- *//* SPDX-License-Identifier: GPL-2.0 */
--
--/*
-- *
-- * (C) COPYRIGHT 2019-2020 ARM Limited. All rights reserved.
-+ * (C) COPYRIGHT 2019-2021 ARM Limited. All rights reserved.
-  *
-  * This program is free software and is provided to you under the terms of the
-  * GNU General Public License version 2 as published by the Free Software
-@@ -38,7 +17,6 @@
-  * along with this program; if not, you can access it online at
-  * http://www.gnu.org/licenses/gpl-2.0.html.
-  *
-- *
-  */
- 
- /**
-@@ -50,7 +28,7 @@
- #define _MALI_KBASE_ARBITER_INTERFACE_H_
- 
- /**
-- * @brief Mali arbiter interface version
-+ *  Mali arbiter interface version
-  *
-  * This specifies the current version of the configuration interface. Whenever
-  * the arbiter interface changes, so that integration effort is required, the
-@@ -61,8 +39,15 @@
-  * 1 - Added the Mali arbiter configuration interface.
-  * 2 - Strip out reference code from header
-  * 3 - Removed DVFS utilization interface (DVFS moved to arbiter side)
-+ * 4 - Added max_config support
-+ * 5 - Added GPU clock frequency reporting support from arbiter
-  */
--#define MALI_KBASE_ARBITER_INTERFACE_VERSION 3
-+#define MALI_KBASE_ARBITER_INTERFACE_VERSION 5
-+
-+/**
-+ * NO_FREQ is used in case platform doesn't support reporting frequency
-+ */
-+#define NO_FREQ 0
- 
- struct arbiter_if_dev;
- 
-@@ -108,6 +93,27 @@ struct arbiter_if_arb_vm_ops {
- 	 * If successful, will respond with a vm_arb_gpu_stopped message.
- 	 */
- 	void (*arb_vm_gpu_lost)(struct device *dev);
-+
-+	/**
-+	 * arb_vm_max_config() - Send max config info to the VM
-+	 * @dev: The arbif kernel module device.
-+	 * @max_l2_slices: The maximum number of L2 slices.
-+	 * @max_core_mask: The largest core mask.
-+	 *
-+	 * Informs KBase the maximum resources that can be allocated to the
-+	 * partition in use.
-+	 */
-+	void (*arb_vm_max_config)(struct device *dev, uint32_t max_l2_slices,
-+				  uint32_t max_core_mask);
-+
-+	/**
-+	 * arb_vm_update_freq() - GPU clock frequency has been updated
-+	 * @dev: The arbif kernel module device.
-+	 * @freq: GPU clock frequency value reported from arbiter
-+	 *
-+	 * Informs KBase that the GPU clock frequency has been updated.
-+	 */
-+	void (*arb_vm_update_freq)(struct device *dev, uint32_t freq);
- };
- 
- /**
-@@ -126,6 +132,11 @@ struct arbiter_if_vm_arb_ops {
- 	 * @dev: The device structure to supply in the callbacks.
- 	 * @ops: The callbacks that the device driver supports
- 	 *       (none are optional).
-+	 *
-+	 * Return:
-+	 * * 0			- successful.
-+	 * * -EINVAL		- invalid argument.
-+	 * * -EPROBE_DEFER	- module dependencies are not yet available.
- 	 */
- 	int (*vm_arb_register_dev)(struct arbiter_if_dev *arbif_dev,
- 		struct device *dev, struct arbiter_if_arb_vm_ops *ops);
-@@ -136,6 +147,13 @@ struct arbiter_if_vm_arb_ops {
- 	 */
- 	void (*vm_arb_unregister_dev)(struct arbiter_if_dev *arbif_dev);
- 
-+	/**
-+	 * vm_arb_gpu_get_max_config() - Request the max config from the
-+	 * Arbiter.
-+	 * @arbif_dev: The arbiter interface we want to issue the request.
-+	 */
-+	void (*vm_arb_get_max_config)(struct arbiter_if_dev *arbif_dev);
-+
- 	/**
- 	 * vm_arb_gpu_request() - Ask the arbiter interface for GPU access.
- 	 * @arbif_dev: The arbiter interface we want to issue the request.
-diff --git a/dvalin/kernel/drivers/gpu/arm/midgard/arbiter/mali_kbase_arbiter_pm.c b/dvalin/kernel/drivers/gpu/arm/midgard/arbiter/mali_kbase_arbiter_pm.c
-index 6c35e16..5c75686 100644
---- a/dvalin/kernel/drivers/gpu/arm/midgard/arbiter/mali_kbase_arbiter_pm.c
-+++ b/dvalin/kernel/drivers/gpu/arm/midgard/arbiter/mali_kbase_arbiter_pm.c
-@@ -1,13 +1,12 @@
--// SPDX-License-Identifier: GPL-2.0
--
-+// SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note
- /*
-  *
-- * (C) COPYRIGHT 2019-2020 ARM Limited. All rights reserved.
-+ * (C) COPYRIGHT 2019-2021 ARM Limited. All rights reserved.
-  *
-  * This program is free software and is provided to you under the terms of the
-  * GNU General Public License version 2 as published by the Free Software
-  * Foundation, and any use by you of this program is subject to the terms
-- * of such GNU licence.
-+ * of such GNU license.
-  *
-  * This program is distributed in the hope that it will be useful,
-  * but WITHOUT ANY WARRANTY; without even the implied warranty of
-@@ -18,27 +17,49 @@
-  * along with this program; if not, you can access it online at
-  * http://www.gnu.org/licenses/gpl-2.0.html.
-  *
-- * SPDX-License-Identifier: GPL-2.0
-- *
-  */
- 
- /**
-- * @file mali_kbase_arbiter_pm.c
-+ * @file
-  * Mali arbiter power manager state machine and APIs
-  */
- 
- #include <mali_kbase.h>
- #include <mali_kbase_pm.h>
- #include <mali_kbase_hwaccess_jm.h>
--#include <mali_kbase_irq_internal.h>
-+#include <backend/gpu/mali_kbase_irq_internal.h>
- #include <mali_kbase_hwcnt_context.h>
--#include <mali_kbase_pm_internal.h>
-+#include <backend/gpu/mali_kbase_pm_internal.h>
- #include <tl/mali_kbase_tracepoints.h>
-+#include <mali_kbase_gpuprops.h>
-+
-+/* A dmesg warning will occur if the GPU is not granted
-+ * after the following time (in milliseconds) has ellapsed.
-+ */
-+#define GPU_REQUEST_TIMEOUT 1000
-+#define KHZ_TO_HZ 1000
-+
-+#define MAX_L2_SLICES_MASK		0xFF
-+
-+/* Maximum time in ms, before deferring probe incase
-+ * GPU_GRANTED message is not received
-+ */
-+static int gpu_req_timeout = 1;
-+module_param(gpu_req_timeout, int, 0644);
-+MODULE_PARM_DESC(gpu_req_timeout,
-+	"On a virtualized platform, if the GPU is not granted within this time(ms) kbase will defer the probe");
- 
- static void kbase_arbiter_pm_vm_wait_gpu_assignment(struct kbase_device *kbdev);
- static inline bool kbase_arbiter_pm_vm_gpu_assigned_lockheld(
- 	struct kbase_device *kbdev);
- 
-+/**
-+ * kbase_arbiter_pm_vm_state_str() - Helper function to get string
-+ *                                   for kbase VM state.(debug)
-+ * @state: kbase VM state
-+ *
-+ * Return: string representation of Kbase_vm_state
-+ */
- static inline const char *kbase_arbiter_pm_vm_state_str(
- 	enum kbase_vm_state state)
- {
-@@ -73,6 +94,13 @@ static inline const char *kbase_arbiter_pm_vm_state_str(
- 	}
- }
- 
-+/**
-+ * kbase_arbiter_pm_vm_event_str() - Helper function to get string
-+ *                                   for kbase VM event.(debug)
-+ * @evt: kbase VM state
-+ *
-+ * Return: String representation of Kbase_arbif_event
-+ */
- static inline const char *kbase_arbiter_pm_vm_event_str(
- 	enum kbase_arbif_evt evt)
- {
-@@ -99,6 +127,13 @@ static inline const char *kbase_arbiter_pm_vm_event_str(
- 	}
- }
- 
-+/**
-+ * kbase_arbiter_pm_vm_set_state() - Sets new kbase_arbiter_vm_state
-+ * @kbdev: The kbase device structure for the device (must be a valid pointer)
-+ * @new_state: kbase VM new state
-+ *
-+ * This function sets the new state for the VM
-+ */
- static void kbase_arbiter_pm_vm_set_state(struct kbase_device *kbdev,
- 	enum kbase_vm_state new_state)
- {
-@@ -107,11 +142,22 @@ static void kbase_arbiter_pm_vm_set_state(struct kbase_device *kbdev,
- 	dev_dbg(kbdev->dev, "VM set_state %s -> %s",
- 	kbase_arbiter_pm_vm_state_str(arb_vm_state->vm_state),
- 	kbase_arbiter_pm_vm_state_str(new_state));
-+
- 	lockdep_assert_held(&arb_vm_state->vm_state_lock);
- 	arb_vm_state->vm_state = new_state;
-+	if (new_state != KBASE_VM_STATE_INITIALIZING_WITH_GPU &&
-+		new_state != KBASE_VM_STATE_INITIALIZING)
-+		KBASE_KTRACE_ADD(kbdev, ARB_VM_STATE, NULL, new_state);
- 	wake_up(&arb_vm_state->vm_state_wait);
- }
- 
-+/**
-+ * kbase_arbiter_pm_suspend_wq() - suspend work queue of the driver.
-+ * @data: work queue
-+ *
-+ * Suspends work queue of the driver, when VM is in SUSPEND_PENDING or
-+ * STOPPING_IDLE or STOPPING_ACTIVE state
-+ */
- static void kbase_arbiter_pm_suspend_wq(struct work_struct *data)
- {
- 	struct kbase_arbiter_vm_state *arb_vm_state = container_of(data,
-@@ -136,6 +182,13 @@ static void kbase_arbiter_pm_suspend_wq(struct work_struct *data)
- 	dev_dbg(kbdev->dev, "<%s\n", __func__);
- }
- 
-+/**
-+ * kbase_arbiter_pm_resume_wq() -Kbase resume work queue.
-+ * @data: work item
-+ *
-+ * Resume work queue of the driver when VM is in STARTING state,
-+ * else if its in STOPPING_ACTIVE will request a stop event.
-+ */
- static void kbase_arbiter_pm_resume_wq(struct work_struct *data)
- {
- 	struct kbase_arbiter_vm_state *arb_vm_state = container_of(data,
-@@ -157,9 +210,74 @@ static void kbase_arbiter_pm_resume_wq(struct work_struct *data)
- 	}
- 	arb_vm_state->vm_arb_starting = false;
- 	mutex_unlock(&arb_vm_state->vm_state_lock);
-+	KBASE_TLSTREAM_TL_ARBITER_STARTED(kbdev, kbdev);
- 	dev_dbg(kbdev->dev, "<%s\n", __func__);
- }
- 
-+/**
-+ * request_timer_callback() - Issue warning on request timer expiration
-+ * @timer: Request hr timer data
-+ *
-+ * Called when the Arbiter takes too long to grant the GPU after a
-+ * request has been made.  Issues a warning in dmesg.
-+ *
-+ * Return: Always returns HRTIMER_NORESTART
-+ */
-+static enum hrtimer_restart request_timer_callback(struct hrtimer *timer)
-+{
-+	struct kbase_arbiter_vm_state *arb_vm_state = container_of(timer,
-+			struct kbase_arbiter_vm_state, vm_request_timer);
-+
-+	KBASE_DEBUG_ASSERT(arb_vm_state);
-+	KBASE_DEBUG_ASSERT(arb_vm_state->kbdev);
-+
-+	dev_warn(arb_vm_state->kbdev->dev,
-+		"Still waiting for GPU to be granted from Arbiter after %d ms\n",
-+		GPU_REQUEST_TIMEOUT);
-+	return HRTIMER_NORESTART;
-+}
-+
-+/**
-+ * start_request_timer() - Start a timer after requesting GPU
-+ * @kbdev: The kbase device structure for the device (must be a valid pointer)
-+ *
-+ * Start a timer to track when kbase is waiting for the GPU from the
-+ * Arbiter.  If the timer expires before GPU is granted, a warning in
-+ * dmesg will be issued.
-+ */
-+static void start_request_timer(struct kbase_device *kbdev)
-+{
-+	struct kbase_arbiter_vm_state *arb_vm_state = kbdev->pm.arb_vm_state;
-+
-+	hrtimer_start(&arb_vm_state->vm_request_timer,
-+			HR_TIMER_DELAY_MSEC(GPU_REQUEST_TIMEOUT),
-+			HRTIMER_MODE_REL);
-+}
-+
-+/**
-+ * cancel_request_timer() - Stop the request timer
-+ * @kbdev: The kbase device structure for the device (must be a valid pointer)
-+ *
-+ * Stops the request timer once GPU has been granted.  Safe to call
-+ * even if timer is no longer running.
-+ */
-+static void cancel_request_timer(struct kbase_device *kbdev)
-+{
-+	struct kbase_arbiter_vm_state *arb_vm_state = kbdev->pm.arb_vm_state;
-+
-+	hrtimer_cancel(&arb_vm_state->vm_request_timer);
-+}
-+
-+/**
-+ * kbase_arbiter_pm_early_init() - Initialize arbiter for VM
-+ *                                 Paravirtualized use.
-+ * @kbdev: The kbase device structure for the device (must be a valid pointer)
-+ *
-+ * Initialize the arbiter and other required resources during the runtime
-+ * and request the GPU for the VM for the first time.
-+ *
-+ * Return: 0 if success, or a Linux error code
-+ */
- int kbase_arbiter_pm_early_init(struct kbase_device *kbdev)
- {
- 	int err;
-@@ -179,29 +297,49 @@ int kbase_arbiter_pm_early_init(struct kbase_device *kbdev)
- 		WQ_HIGHPRI);
- 	if (!arb_vm_state->vm_arb_wq) {
- 		dev_err(kbdev->dev, "Failed to allocate vm_arb workqueue\n");
-+		kfree(arb_vm_state);
- 		return -ENOMEM;
- 	}
- 	INIT_WORK(&arb_vm_state->vm_suspend_work, kbase_arbiter_pm_suspend_wq);
- 	INIT_WORK(&arb_vm_state->vm_resume_work, kbase_arbiter_pm_resume_wq);
- 	arb_vm_state->vm_arb_starting = false;
--	arb_vm_state->vm_arb_users_waiting = 0;
-+	atomic_set(&kbdev->pm.gpu_users_waiting, 0);
-+	hrtimer_init(&arb_vm_state->vm_request_timer, CLOCK_MONOTONIC,
-+							HRTIMER_MODE_REL);
-+	arb_vm_state->vm_request_timer.function =
-+						request_timer_callback;
- 	kbdev->pm.arb_vm_state = arb_vm_state;
- 
- 	err = kbase_arbif_init(kbdev);
- 	if (err) {
-+		dev_err(kbdev->dev, "Failed to initialise arbif module\n");
- 		goto arbif_init_fail;
- 	}
-+
- 	if (kbdev->arb.arb_if) {
- 		kbase_arbif_gpu_request(kbdev);
- 		dev_dbg(kbdev->dev, "Waiting for initial GPU assignment...\n");
--		wait_event(arb_vm_state->vm_state_wait,
-+		err = wait_event_timeout(arb_vm_state->vm_state_wait,
- 			arb_vm_state->vm_state ==
--					KBASE_VM_STATE_INITIALIZING_WITH_GPU);
-+					KBASE_VM_STATE_INITIALIZING_WITH_GPU,
-+			msecs_to_jiffies(gpu_req_timeout));
-+
-+		if (!err) {
-+			dev_dbg(kbdev->dev,
-+			"Kbase probe Deferred after waiting %d ms to receive GPU_GRANT\n",
-+			gpu_req_timeout);
-+			err = -EPROBE_DEFER;
-+			goto arbif_eprobe_defer;
-+		}
-+
- 		dev_dbg(kbdev->dev,
- 			"Waiting for initial GPU assignment - done\n");
- 	}
- 	return 0;
- 
-+arbif_eprobe_defer:
-+	kbase_arbiter_pm_early_term(kbdev);
-+	return err;
- arbif_init_fail:
- 	destroy_workqueue(arb_vm_state->vm_arb_wq);
- 	kfree(arb_vm_state);
-@@ -209,35 +347,72 @@ arbif_init_fail:
- 	return err;
- }
- 
-+/**
-+ * kbase_arbiter_pm_early_term() - Shutdown arbiter and free resources
-+ * @kbdev: The kbase device structure for the device (must be a valid pointer)
-+ *
-+ * Clean up all the resources
-+ */
- void kbase_arbiter_pm_early_term(struct kbase_device *kbdev)
- {
- 	struct kbase_arbiter_vm_state *arb_vm_state = kbdev->pm.arb_vm_state;
- 
-+	cancel_request_timer(kbdev);
- 	mutex_lock(&arb_vm_state->vm_state_lock);
--	if (arb_vm_state->vm_state > KBASE_VM_STATE_STOPPED_GPU_REQUESTED)
-+	if (arb_vm_state->vm_state > KBASE_VM_STATE_STOPPED_GPU_REQUESTED) {
-+		kbase_pm_set_gpu_lost(kbdev, false);
- 		kbase_arbif_gpu_stopped(kbdev, false);
--
-+	}
- 	mutex_unlock(&arb_vm_state->vm_state_lock);
--	kbase_arbif_destroy(kbdev);
- 	destroy_workqueue(arb_vm_state->vm_arb_wq);
-+	kbase_arbif_destroy(kbdev);
- 	arb_vm_state->vm_arb_wq = NULL;
- 	kfree(kbdev->pm.arb_vm_state);
- 	kbdev->pm.arb_vm_state = NULL;
- }
- 
-+/**
-+ * kbase_arbiter_pm_release_interrupts() - Release the GPU interrupts
-+ * @kbdev: The kbase device structure for the device (must be a valid pointer)
-+ *
-+ * Releases interrupts and set the interrupt flag to false
-+ */
- void kbase_arbiter_pm_release_interrupts(struct kbase_device *kbdev)
- {
- 	struct kbase_arbiter_vm_state *arb_vm_state = kbdev->pm.arb_vm_state;
- 
- 	mutex_lock(&arb_vm_state->vm_state_lock);
--	if (!kbdev->arb.arb_if ||
--			arb_vm_state->vm_state >
--					KBASE_VM_STATE_STOPPED_GPU_REQUESTED)
-+	if (arb_vm_state->interrupts_installed == true) {
-+		arb_vm_state->interrupts_installed = false;
- 		kbase_release_interrupts(kbdev);
-+	}
-+	mutex_unlock(&arb_vm_state->vm_state_lock);
-+}
- 
-+/**
-+ * kbase_arbiter_pm_install_interrupts() - Install the GPU interrupts
-+ * @kbdev: The kbase device structure for the device (must be a valid pointer)
-+ *
-+ * Install interrupts and set the interrupt_install flag to true.
-+ */
-+int kbase_arbiter_pm_install_interrupts(struct kbase_device *kbdev)
-+{
-+	struct kbase_arbiter_vm_state *arb_vm_state = kbdev->pm.arb_vm_state;
-+	int err;
-+
-+	mutex_lock(&arb_vm_state->vm_state_lock);
-+	arb_vm_state->interrupts_installed = true;
-+	err = kbase_install_interrupts(kbdev);
- 	mutex_unlock(&arb_vm_state->vm_state_lock);
-+	return err;
- }
- 
-+/**
-+ * kbase_arbiter_pm_vm_stopped() - Handle stop state for the VM
-+ * @kbdev: The kbase device structure for the device (must be a valid pointer)
-+ *
-+ * Handles a stop state for the VM
-+ */
- void kbase_arbiter_pm_vm_stopped(struct kbase_device *kbdev)
- {
- 	bool request_gpu = false;
-@@ -245,14 +420,19 @@ void kbase_arbiter_pm_vm_stopped(struct kbase_device *kbdev)
- 
- 	lockdep_assert_held(&arb_vm_state->vm_state_lock);
- 
--	if (arb_vm_state->vm_arb_users_waiting > 0 &&
-+	if (atomic_read(&kbdev->pm.gpu_users_waiting) > 0 &&
- 			arb_vm_state->vm_state == KBASE_VM_STATE_STOPPING_IDLE)
- 		kbase_arbiter_pm_vm_set_state(kbdev,
- 			 KBASE_VM_STATE_STOPPING_ACTIVE);
- 
- 	dev_dbg(kbdev->dev, "%s %s\n", __func__,
- 		kbase_arbiter_pm_vm_state_str(arb_vm_state->vm_state));
--	kbase_release_interrupts(kbdev);
-+
-+	if (arb_vm_state->interrupts_installed) {
-+		arb_vm_state->interrupts_installed = false;
-+		kbase_release_interrupts(kbdev);
-+	}
-+
- 	switch (arb_vm_state->vm_state) {
- 	case KBASE_VM_STATE_STOPPING_ACTIVE:
- 		request_gpu = true;
-@@ -271,14 +451,95 @@ void kbase_arbiter_pm_vm_stopped(struct kbase_device *kbdev)
- 		break;
- 	}
- 
-+	kbase_pm_set_gpu_lost(kbdev, false);
- 	kbase_arbif_gpu_stopped(kbdev, request_gpu);
-+	if (request_gpu)
-+		start_request_timer(kbdev);
-+}
-+
-+void kbase_arbiter_set_max_config(struct kbase_device *kbdev,
-+				  uint32_t max_l2_slices,
-+				  uint32_t max_core_mask)
-+{
-+	struct kbase_arbiter_vm_state *arb_vm_state;
-+	struct max_config_props max_config;
-+
-+	if (!kbdev)
-+		return;
-+
-+	/* Mask the max_l2_slices as it is stored as 8 bits into kbase */
-+	max_config.l2_slices = max_l2_slices & MAX_L2_SLICES_MASK;
-+	max_config.core_mask = max_core_mask;
-+	arb_vm_state = kbdev->pm.arb_vm_state;
-+
-+	mutex_lock(&arb_vm_state->vm_state_lock);
-+	/* Just set the max_props in kbase during initialization. */
-+	if (arb_vm_state->vm_state == KBASE_VM_STATE_INITIALIZING)
-+		kbase_gpuprops_set_max_config(kbdev, &max_config);
-+	else
-+		dev_dbg(kbdev->dev, "Unexpected max_config on VM state %s",
-+			kbase_arbiter_pm_vm_state_str(arb_vm_state->vm_state));
-+
-+	mutex_unlock(&arb_vm_state->vm_state_lock);
-+}
-+
-+int kbase_arbiter_pm_gpu_assigned(struct kbase_device *kbdev)
-+{
-+	struct kbase_arbiter_vm_state *arb_vm_state;
-+	int result = -EINVAL;
-+
-+	if (!kbdev)
-+		return result;
-+
-+	/* First check the GPU_LOST state */
-+	kbase_pm_lock(kbdev);
-+	if (kbase_pm_is_gpu_lost(kbdev)) {
-+		kbase_pm_unlock(kbdev);
-+		return 0;
-+	}
-+	kbase_pm_unlock(kbdev);
-+
-+	/* Then the arbitration state machine */
-+	arb_vm_state = kbdev->pm.arb_vm_state;
-+
-+	mutex_lock(&arb_vm_state->vm_state_lock);
-+	switch (arb_vm_state->vm_state) {
-+	case KBASE_VM_STATE_INITIALIZING:
-+	case KBASE_VM_STATE_SUSPENDED:
-+	case KBASE_VM_STATE_STOPPED:
-+	case KBASE_VM_STATE_STOPPED_GPU_REQUESTED:
-+	case KBASE_VM_STATE_SUSPEND_WAIT_FOR_GRANT:
-+		result = 0;
-+		break;
-+	default:
-+		result = 1;
-+		break;
-+	}
-+	mutex_unlock(&arb_vm_state->vm_state_lock);
-+
-+	return result;
- }
- 
-+/**
-+ * kbase_arbiter_pm_vm_gpu_start() - Handles the start state of the VM
-+ * @kbdev: The kbase device structure for the device (must be a valid pointer)
-+ *
-+ * Handles the start state of the VM
-+ */
- static void kbase_arbiter_pm_vm_gpu_start(struct kbase_device *kbdev)
- {
- 	struct kbase_arbiter_vm_state *arb_vm_state = kbdev->pm.arb_vm_state;
-+	bool freq_updated = false;
- 
- 	lockdep_assert_held(&arb_vm_state->vm_state_lock);
-+	mutex_lock(&kbdev->arb.arb_freq.arb_freq_lock);
-+	if (kbdev->arb.arb_freq.freq_updated) {
-+		kbdev->arb.arb_freq.freq_updated = false;
-+		freq_updated = true;
-+	}
-+	mutex_unlock(&kbdev->arb.arb_freq.arb_freq_lock);
-+
-+	cancel_request_timer(kbdev);
- 	switch (arb_vm_state->vm_state) {
- 	case KBASE_VM_STATE_INITIALIZING:
- 		kbase_arbiter_pm_vm_set_state(kbdev,
-@@ -286,22 +547,43 @@ static void kbase_arbiter_pm_vm_gpu_start(struct kbase_device *kbdev)
- 		break;
- 	case KBASE_VM_STATE_STOPPED_GPU_REQUESTED:
- 		kbase_arbiter_pm_vm_set_state(kbdev, KBASE_VM_STATE_STARTING);
-+		arb_vm_state->interrupts_installed = true;
- 		kbase_install_interrupts(kbdev);
-+		/*
-+		 * GPU GRANTED received while in stop can be a result of a
-+		 * repartitioning.
-+		 */
-+		kbase_gpuprops_req_curr_config_update(kbdev);
-+		/* curr_config will be updated while resuming the PM. */
- 		queue_work(arb_vm_state->vm_arb_wq,
- 			&arb_vm_state->vm_resume_work);
- 		break;
- 	case KBASE_VM_STATE_SUSPEND_WAIT_FOR_GRANT:
-+		kbase_pm_set_gpu_lost(kbdev, false);
- 		kbase_arbif_gpu_stopped(kbdev, false);
- 		kbase_arbiter_pm_vm_set_state(kbdev, KBASE_VM_STATE_SUSPENDED);
- 		break;
- 	default:
--		dev_warn(kbdev->dev,
--			"GPU_GRANTED when not expected - state %s\n",
--			kbase_arbiter_pm_vm_state_str(arb_vm_state->vm_state));
-+		/*
-+		 * GPU_GRANTED can be received when there is a frequency update
-+		 * Only show a warning if received in an unexpected state
-+		 * without a frequency update
-+		 */
-+		if (!freq_updated)
-+			dev_warn(kbdev->dev,
-+				"GPU_GRANTED when not expected - state %s\n",
-+				kbase_arbiter_pm_vm_state_str(
-+					arb_vm_state->vm_state));
- 		break;
- 	}
- }
- 
-+/**
-+ * kbase_arbiter_pm_vm_gpu_stop() - Handles the stop state of the VM
-+ * @kbdev: The kbase device structure for the device (must be a valid pointer)
-+ *
-+ * Handles the start state of the VM
-+ */
- static void kbase_arbiter_pm_vm_gpu_stop(struct kbase_device *kbdev)
- {
- 	struct kbase_arbiter_vm_state *arb_vm_state = kbdev->pm.arb_vm_state;
-@@ -344,9 +626,16 @@ static void kbase_arbiter_pm_vm_gpu_stop(struct kbase_device *kbdev)
- 	}
- }
- 
-+/**
-+ * kbase_gpu_lost() - Kbase signals GPU is lost on a lost event signal
-+ * @kbdev: The kbase device structure for the device (must be a valid pointer)
-+ *
-+ * On GPU lost event signals GPU_LOST to the aribiter
-+ */
- static void kbase_gpu_lost(struct kbase_device *kbdev)
- {
- 	struct kbase_arbiter_vm_state *arb_vm_state = kbdev->pm.arb_vm_state;
-+	bool handle_gpu_lost = false;
- 
- 	lockdep_assert_held(&arb_vm_state->vm_state_lock);
- 
-@@ -357,33 +646,47 @@ static void kbase_gpu_lost(struct kbase_device *kbdev)
- 		dev_warn(kbdev->dev, "GPU lost in state %s",
- 		kbase_arbiter_pm_vm_state_str(arb_vm_state->vm_state));
- 		kbase_arbiter_pm_vm_gpu_stop(kbdev);
--		mutex_unlock(&arb_vm_state->vm_state_lock);
--		kbase_pm_handle_gpu_lost(kbdev);
--		mutex_lock(&arb_vm_state->vm_state_lock);
-+		handle_gpu_lost = true;
- 		break;
- 	case KBASE_VM_STATE_STOPPING_IDLE:
- 	case KBASE_VM_STATE_STOPPING_ACTIVE:
- 	case KBASE_VM_STATE_SUSPEND_PENDING:
--		dev_info(kbdev->dev, "GPU lost while stopping");
--		mutex_unlock(&arb_vm_state->vm_state_lock);
--		kbase_pm_handle_gpu_lost(kbdev);
--		mutex_lock(&arb_vm_state->vm_state_lock);
-+		dev_dbg(kbdev->dev, "GPU lost while stopping");
-+		handle_gpu_lost = true;
- 		break;
- 	case KBASE_VM_STATE_SUSPENDED:
- 	case KBASE_VM_STATE_STOPPED:
- 	case KBASE_VM_STATE_STOPPED_GPU_REQUESTED:
--		dev_info(kbdev->dev, "GPU lost while already stopped");
-+		dev_dbg(kbdev->dev, "GPU lost while already stopped");
- 		break;
- 	case KBASE_VM_STATE_SUSPEND_WAIT_FOR_GRANT:
--		dev_info(kbdev->dev, "GPU lost while waiting to suspend");
-+		dev_dbg(kbdev->dev, "GPU lost while waiting to suspend");
- 		kbase_arbiter_pm_vm_set_state(kbdev, KBASE_VM_STATE_SUSPENDED);
- 		break;
- 	default:
- 		break;
- 	}
--
-+	if (handle_gpu_lost) {
-+		/* Releasing the VM state lock here is safe because
-+		 * we are guaranteed to be in either STOPPING_IDLE,
-+		 * STOPPING_ACTIVE or SUSPEND_PENDING at this point.
-+		 * The only transitions that are valid from here are to
-+		 * STOPPED, STOPPED_GPU_REQUESTED or SUSPENDED which can
-+		 * only happen at the completion of the GPU lost handling.
-+		 */
-+		mutex_unlock(&arb_vm_state->vm_state_lock);
-+		kbase_pm_handle_gpu_lost(kbdev);
-+		mutex_lock(&arb_vm_state->vm_state_lock);
-+	}
- }
- 
-+/**
-+ * kbase_arbiter_pm_vm_os_suspend_ready_state() - checks if VM is ready
-+ *			to be moved to suspended state.
-+ * @kbdev: The kbase device structure for the device (must be a valid pointer)
-+ *
-+ * Return: True if its ready to be suspended else False.
-+ */
- static inline bool kbase_arbiter_pm_vm_os_suspend_ready_state(
- 	struct kbase_device *kbdev)
- {
-@@ -398,6 +701,14 @@ static inline bool kbase_arbiter_pm_vm_os_suspend_ready_state(
- 	}
- }
- 
-+/**
-+ * kbase_arbiter_pm_vm_os_prepare_suspend() - Prepare OS to be in suspend state
-+ *                             until it receives the grant message from arbiter
-+ * @kbdev: The kbase device structure for the device (must be a valid pointer)
-+ *
-+ * Prepares OS to be in suspend state until it receives GRANT message
-+ * from Arbiter asynchronously.
-+ */
- static void kbase_arbiter_pm_vm_os_prepare_suspend(struct kbase_device *kbdev)
- {
- 	struct kbase_arbiter_vm_state *arb_vm_state = kbdev->pm.arb_vm_state;
-@@ -463,6 +774,14 @@ static void kbase_arbiter_pm_vm_os_prepare_suspend(struct kbase_device *kbdev)
- 	}
- }
- 
-+/**
-+ * kbase_arbiter_pm_vm_os_resume() - Resume OS function once it receives
-+ *                                   a grant message from arbiter
-+ * @kbdev: The kbase device structure for the device (must be a valid pointer)
-+ *
-+ * Resume OS function once it receives GRANT message
-+ * from Arbiter asynchronously.
-+ */
- static void kbase_arbiter_pm_vm_os_resume(struct kbase_device *kbdev)
- {
- 	struct kbase_arbiter_vm_state *arb_vm_state = kbdev->pm.arb_vm_state;
-@@ -475,6 +794,7 @@ static void kbase_arbiter_pm_vm_os_resume(struct kbase_device *kbdev)
- 	kbase_arbiter_pm_vm_set_state(kbdev,
- 		KBASE_VM_STATE_STOPPED_GPU_REQUESTED);
- 	kbase_arbif_gpu_request(kbdev);
-+	start_request_timer(kbdev);
- 
- 	/* Release lock and block resume OS function until we have
- 	 * asynchronously received the GRANT message from the Arbiter and
-@@ -486,6 +806,14 @@ static void kbase_arbiter_pm_vm_os_resume(struct kbase_device *kbdev)
- 	mutex_lock(&arb_vm_state->vm_state_lock);
- }
- 
-+/**
-+ * kbase_arbiter_pm_vm_event() - Dispatch VM event to the state machine.
-+ * @kbdev: The kbase device structure for the device (must be a valid pointer)
-+ * @evt: VM event
-+ *
-+ * The state machine function. Receives events and transitions states
-+ * according the event received and the current state
-+ */
- void kbase_arbiter_pm_vm_event(struct kbase_device *kbdev,
- 	enum kbase_arbif_evt evt)
- {
-@@ -497,7 +825,9 @@ void kbase_arbiter_pm_vm_event(struct kbase_device *kbdev,
- 	mutex_lock(&arb_vm_state->vm_state_lock);
- 	dev_dbg(kbdev->dev, "%s %s\n", __func__,
- 		kbase_arbiter_pm_vm_event_str(evt));
--
-+	if (arb_vm_state->vm_state != KBASE_VM_STATE_INITIALIZING_WITH_GPU &&
-+		arb_vm_state->vm_state != KBASE_VM_STATE_INITIALIZING)
-+		KBASE_KTRACE_ADD(kbdev, ARB_VM_EVT, NULL, evt);
- 	switch (evt) {
- 	case KBASE_VM_GPU_GRANTED_EVT:
- 		kbase_arbiter_pm_vm_gpu_start(kbdev);
-@@ -506,7 +836,7 @@ void kbase_arbiter_pm_vm_event(struct kbase_device *kbdev,
- 		kbase_arbiter_pm_vm_gpu_stop(kbdev);
- 		break;
- 	case KBASE_VM_GPU_LOST_EVT:
--		dev_info(kbdev->dev, "KBASE_ARBIF_GPU_LOST_EVT!");
-+		dev_dbg(kbdev->dev, "KBASE_ARBIF_GPU_LOST_EVT!");
- 		kbase_gpu_lost(kbdev);
- 		break;
- 	case KBASE_VM_OS_SUSPEND_EVENT:
-@@ -530,8 +860,6 @@ void kbase_arbiter_pm_vm_event(struct kbase_device *kbdev,
- 	case KBASE_VM_REF_EVENT:
- 		switch (arb_vm_state->vm_state) {
- 		case KBASE_VM_STATE_STARTING:
--			KBASE_TLSTREAM_TL_EVENT_ARB_STARTED(kbdev, kbdev);
--			/* FALL THROUGH */
- 		case KBASE_VM_STATE_IDLE:
- 			kbase_arbiter_pm_vm_set_state(kbdev,
- 			KBASE_VM_STATE_ACTIVE);
-@@ -547,15 +875,21 @@ void kbase_arbiter_pm_vm_event(struct kbase_device *kbdev,
- 		break;
- 
- 	case KBASE_VM_GPU_INITIALIZED_EVT:
--		lockdep_assert_held(&kbdev->pm.lock);
--		if (kbdev->pm.active_count > 0) {
--			kbase_arbiter_pm_vm_set_state(kbdev,
--				KBASE_VM_STATE_ACTIVE);
--			kbase_arbif_gpu_active(kbdev);
--		} else {
--			kbase_arbiter_pm_vm_set_state(kbdev,
--				KBASE_VM_STATE_IDLE);
--			kbase_arbif_gpu_idle(kbdev);
-+		switch (arb_vm_state->vm_state) {
-+		case KBASE_VM_STATE_INITIALIZING_WITH_GPU:
-+			lockdep_assert_held(&kbdev->pm.lock);
-+			if (kbdev->pm.active_count > 0) {
-+				kbase_arbiter_pm_vm_set_state(kbdev,
-+					KBASE_VM_STATE_ACTIVE);
-+				kbase_arbif_gpu_active(kbdev);
-+			} else {
-+				kbase_arbiter_pm_vm_set_state(kbdev,
-+					KBASE_VM_STATE_IDLE);
-+				kbase_arbif_gpu_idle(kbdev);
-+			}
-+			break;
-+		default:
-+			break;
- 		}
- 		break;
- 
-@@ -566,6 +900,14 @@ void kbase_arbiter_pm_vm_event(struct kbase_device *kbdev,
- 	mutex_unlock(&arb_vm_state->vm_state_lock);
- }
- 
-+KBASE_EXPORT_TEST_API(kbase_arbiter_pm_vm_event);
-+
-+/**
-+ * kbase_arbiter_pm_vm_wait_gpu_assignment() - VM wait for a GPU assignment.
-+ * @kbdev: The kbase device structure for the device (must be a valid pointer)
-+ *
-+ * VM waits for a GPU assignment.
-+ */
- static void kbase_arbiter_pm_vm_wait_gpu_assignment(struct kbase_device *kbdev)
- {
- 	struct kbase_arbiter_vm_state *arb_vm_state = kbdev->pm.arb_vm_state;
-@@ -577,6 +919,12 @@ static void kbase_arbiter_pm_vm_wait_gpu_assignment(struct kbase_device *kbdev)
- 	dev_dbg(kbdev->dev, "Waiting for GPU assignment - done\n");
- }
- 
-+/**
-+ * kbase_arbiter_pm_vm_gpu_assigned_lockheld() - Check if VM holds VM state lock
-+ * @kbdev: The kbase device structure for the device (must be a valid pointer)
-+ *
-+ * Checks if the virtual machine holds VM state lock.
-+ */
- static inline bool kbase_arbiter_pm_vm_gpu_assigned_lockheld(
- 	struct kbase_device *kbdev)
- {
-@@ -587,11 +935,25 @@ static inline bool kbase_arbiter_pm_vm_gpu_assigned_lockheld(
- 		arb_vm_state->vm_state == KBASE_VM_STATE_ACTIVE);
- }
- 
-+/**
-+ * kbase_arbiter_pm_ctx_active_handle_suspend() - Handle suspend operation for
-+ *                                                arbitration mode
-+ * @kbdev: The kbase device structure for the device (must be a valid pointer)
-+ * @suspend_handler: The handler code for how to handle a suspend
-+ *                   that might occur
-+ *
-+ * This function handles a suspend event from the driver,
-+ * communicating with the arbiter and waiting synchronously for the GPU
-+ * to be granted again depending on the VM state.
-+ *
-+ * Return: 0 on success else 1 suspend handler isn not possible.
-+ */
- int kbase_arbiter_pm_ctx_active_handle_suspend(struct kbase_device *kbdev,
- 	enum kbase_pm_suspend_handler suspend_handler)
- {
- 	struct kbasep_js_device_data *js_devdata = &kbdev->js_data;
- 	struct kbase_arbiter_vm_state *arb_vm_state = kbdev->pm.arb_vm_state;
-+	int res = 0;
- 
- 	if (kbdev->arb.arb_if) {
- 		mutex_lock(&arb_vm_state->vm_state_lock);
-@@ -606,30 +968,41 @@ int kbase_arbiter_pm_ctx_active_handle_suspend(struct kbase_device *kbdev,
- 				kbase_arbiter_pm_vm_set_state(kbdev,
- 					KBASE_VM_STATE_STOPPED_GPU_REQUESTED);
- 				kbase_arbif_gpu_request(kbdev);
-+				start_request_timer(kbdev);
- 			} else if (arb_vm_state->vm_state ==
- 					KBASE_VM_STATE_INITIALIZING_WITH_GPU)
- 				break;
- 
- 			if (suspend_handler !=
- 				KBASE_PM_SUSPEND_HANDLER_NOT_POSSIBLE) {
--				if (suspend_handler ==
--					KBASE_PM_SUSPEND_HANDLER_VM_GPU_GRANTED
--						||
--						kbdev->pm.active_count > 0)
--					break;
- 
--				mutex_unlock(&arb_vm_state->vm_state_lock);
--				mutex_unlock(&kbdev->pm.lock);
--				mutex_unlock(&js_devdata->runpool_mutex);
--				return 1;
--			}
-+				/* In case of GPU lost, even if
-+				 * active_count > 0, we no longer have GPU
-+				 * access
-+				 */
-+				if (kbase_pm_is_gpu_lost(kbdev))
-+					res = 1;
- 
--			if (arb_vm_state->vm_state ==
--					KBASE_VM_STATE_INITIALIZING_WITH_GPU)
-+				switch (suspend_handler) {
-+				case KBASE_PM_SUSPEND_HANDLER_DONT_INCREASE:
-+					res = 1;
-+					break;
-+				case KBASE_PM_SUSPEND_HANDLER_DONT_REACTIVATE:
-+					if (kbdev->pm.active_count == 0)
-+						res = 1;
-+					break;
-+				case KBASE_PM_SUSPEND_HANDLER_VM_GPU_GRANTED:
-+					break;
-+				default:
-+					WARN(1, "Unknown suspend_handler\n");
-+					res = 1;
-+					break;
-+				}
- 				break;
-+			}
- 
- 			/* Need to synchronously wait for GPU assignment */
--			arb_vm_state->vm_arb_users_waiting++;
-+			atomic_inc(&kbdev->pm.gpu_users_waiting);
- 			mutex_unlock(&arb_vm_state->vm_state_lock);
- 			mutex_unlock(&kbdev->pm.lock);
- 			mutex_unlock(&js_devdata->runpool_mutex);
-@@ -637,9 +1010,128 @@ int kbase_arbiter_pm_ctx_active_handle_suspend(struct kbase_device *kbdev,
- 			mutex_lock(&js_devdata->runpool_mutex);
- 			mutex_lock(&kbdev->pm.lock);
- 			mutex_lock(&arb_vm_state->vm_state_lock);
--			arb_vm_state->vm_arb_users_waiting--;
-+			atomic_dec(&kbdev->pm.gpu_users_waiting);
- 		}
- 		mutex_unlock(&arb_vm_state->vm_state_lock);
- 	}
--	return 0;
-+	return res;
-+}
-+
-+/**
-+ * kbase_arbiter_pm_update_gpu_freq() - Updates GPU clock frequency received
-+ * from arbiter.
-+ * @arb_freq - Pointer to struchture holding GPU clock frequenecy data
-+ * @freq - New frequency value in KHz
-+ */
-+void kbase_arbiter_pm_update_gpu_freq(struct kbase_arbiter_freq *arb_freq,
-+	uint32_t freq)
-+{
-+	struct kbase_gpu_clk_notifier_data ndata;
-+
-+	mutex_lock(&arb_freq->arb_freq_lock);
-+	if (arb_freq->arb_freq != freq) {
-+		ndata.new_rate = freq * KHZ_TO_HZ;
-+		ndata.old_rate = arb_freq->arb_freq * KHZ_TO_HZ;
-+		ndata.gpu_clk_handle = arb_freq;
-+		arb_freq->arb_freq = freq;
-+		arb_freq->freq_updated = true;
-+		if (arb_freq->nb)
-+			arb_freq->nb->notifier_call(arb_freq->nb,
-+						    POST_RATE_CHANGE, &ndata);
-+	}
-+
-+	mutex_unlock(&arb_freq->arb_freq_lock);
-+}
-+
-+/**
-+ * enumerate_arb_gpu_clk() - Enumerate a GPU clock on the given index
-+ * @kbdev - kbase_device pointer
-+ * @index - GPU clock index
-+ *
-+ * Returns pointer to structure holding GPU clock frequency data reported from
-+ * arbiter, only index 0 is valid.
-+ */
-+static void *enumerate_arb_gpu_clk(struct kbase_device *kbdev,
-+		unsigned int index)
-+{
-+	if (index == 0)
-+		return &kbdev->arb.arb_freq;
-+	return NULL;
-+}
-+
-+/**
-+ * get_arb_gpu_clk_rate() - Get the current rate of GPU clock frequency value
-+ * @kbdev - kbase_device pointer
-+ * @index - GPU clock index
-+ *
-+ * Returns the GPU clock frequency value saved when gpu is granted from arbiter
-+ */
-+static unsigned long get_arb_gpu_clk_rate(struct kbase_device *kbdev,
-+		void *gpu_clk_handle)
-+{
-+	uint32_t freq;
-+	struct kbase_arbiter_freq *arb_dev_freq =
-+			(struct kbase_arbiter_freq *) gpu_clk_handle;
-+
-+	mutex_lock(&arb_dev_freq->arb_freq_lock);
-+	/* Convert from KHz to Hz */
-+	freq = arb_dev_freq->arb_freq * KHZ_TO_HZ;
-+	mutex_unlock(&arb_dev_freq->arb_freq_lock);
-+	return freq;
-+}
-+
-+/**
-+ * arb_gpu_clk_notifier_register() - Register a clock rate change notifier.
-+ * @kbdev          - kbase_device pointer
-+ * @gpu_clk_handle - Handle unique to the enumerated GPU clock
-+ * @nb             - notifier block containing the callback function pointer
-+ *
-+ * Returns 0 on success, negative error code otherwise.
-+ *
-+ * This function registers a callback function that is invoked whenever the
-+ * frequency of the clock corresponding to @gpu_clk_handle changes.
-+ */
-+static int arb_gpu_clk_notifier_register(struct kbase_device *kbdev,
-+	void *gpu_clk_handle, struct notifier_block *nb)
-+{
-+	int ret = 0;
-+	struct kbase_arbiter_freq *arb_dev_freq =
-+		(struct kbase_arbiter_freq *)gpu_clk_handle;
-+
-+	if (!arb_dev_freq->nb)
-+		arb_dev_freq->nb = nb;
-+	else
-+		ret = -EBUSY;
-+
-+	return ret;
-+}
-+
-+/**
-+ * gpu_clk_notifier_unregister() - Unregister clock rate change notifier
-+ * @kbdev          - kbase_device pointer
-+ * @gpu_clk_handle - Handle unique to the enumerated GPU clock
-+ * @nb             - notifier block containing the callback function pointer
-+ *
-+ * This function pointer is used to unregister a callback function that
-+ * was previously registered to get notified of a frequency change of the
-+ * clock corresponding to @gpu_clk_handle.
-+ */
-+static void arb_gpu_clk_notifier_unregister(struct kbase_device *kbdev,
-+	void *gpu_clk_handle, struct notifier_block *nb)
-+{
-+	struct kbase_arbiter_freq *arb_dev_freq =
-+		(struct kbase_arbiter_freq *)gpu_clk_handle;
-+	if (arb_dev_freq->nb == nb) {
-+		arb_dev_freq->nb = NULL;
-+	} else {
-+		dev_err(kbdev->dev, "%s - notifier did not match\n",
-+			 __func__);
-+	}
- }
-+
-+struct kbase_clk_rate_trace_op_conf arb_clk_rate_trace_ops = {
-+	.get_gpu_clk_rate = get_arb_gpu_clk_rate,
-+	.enumerate_gpu_clk = enumerate_arb_gpu_clk,
-+	.gpu_clk_notifier_register = arb_gpu_clk_notifier_register,
-+	.gpu_clk_notifier_unregister = arb_gpu_clk_notifier_unregister
-+};
-diff --git a/dvalin/kernel/drivers/gpu/arm/midgard/arbiter/mali_kbase_arbiter_pm.h b/dvalin/kernel/drivers/gpu/arm/midgard/arbiter/mali_kbase_arbiter_pm.h
-index 3c49eb1..1f570bb 100644
---- a/dvalin/kernel/drivers/gpu/arm/midgard/arbiter/mali_kbase_arbiter_pm.h
-+++ b/dvalin/kernel/drivers/gpu/arm/midgard/arbiter/mali_kbase_arbiter_pm.h
-@@ -1,28 +1,7 @@
-+/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
- /*
-  *
-- * (C) COPYRIGHT ARM Limited. All rights reserved.
-- *
-- * This program is free software and is provided to you under the terms of the
-- * GNU General Public License version 2 as published by the Free Software
-- * Foundation, and any use by you of this program is subject to the terms
-- * of such GNU licence.
-- *
-- * This program is distributed in the hope that it will be useful,
-- * but WITHOUT ANY WARRANTY; without even the implied warranty of
-- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-- * GNU General Public License for more details.
-- *
-- * You should have received a copy of the GNU General Public License
-- * along with this program; if not, you can access it online at
-- * http://www.gnu.org/licenses/gpl-2.0.html.
-- *
-- * SPDX-License-Identifier: GPL-2.0
-- *
-- *//* SPDX-License-Identifier: GPL-2.0 */
--
--/*
-- *
-- * (C) COPYRIGHT 2019-2020 ARM Limited. All rights reserved.
-+ * (C) COPYRIGHT 2019-2021 ARM Limited. All rights reserved.
-  *
-  * This program is free software and is provided to you under the terms of the
-  * GNU General Public License version 2 as published by the Free Software
-@@ -38,8 +17,6 @@
-  * along with this program; if not, you can access it online at
-  * http://www.gnu.org/licenses/gpl-2.0.html.
-  *
-- * SPDX-License-Identifier: GPL-2.0
-- *
-  */
- 
- /**
-@@ -116,10 +93,18 @@ void kbase_arbiter_pm_early_term(struct kbase_device *kbdev);
-  * kbase_arbiter_pm_release_interrupts() - Release the GPU interrupts
-  * @kbdev: The kbase device structure for the device (must be a valid pointer)
-  *
-- * Releases interrupts if needed (GPU is available) otherwise does nothing
-+ * Releases interrupts and set the interrupt flag to false
-  */
- void kbase_arbiter_pm_release_interrupts(struct kbase_device *kbdev);
- 
-+/**
-+ * kbase_arbiter_pm_install_interrupts() - Install the GPU interrupts
-+ * @kbdev: The kbase device structure for the device (must be a valid pointer)
-+ *
-+ * Install interrupts and set the interrupt_install flag to true.
-+ */
-+int kbase_arbiter_pm_install_interrupts(struct kbase_device *kbdev);
-+
- /**
-  * kbase_arbiter_pm_vm_event() - Dispatch VM event to the state machine
-  * @kbdev: The kbase device structure for the device (must be a valid pointer)
-@@ -156,4 +141,54 @@ int kbase_arbiter_pm_ctx_active_handle_suspend(struct kbase_device *kbdev,
-  */
- void kbase_arbiter_pm_vm_stopped(struct kbase_device *kbdev);
- 
-+/**
-+ * kbase_arbiter_set_max_config() - Set the max config data in kbase device.
-+ * @kbdev: The kbase device structure for the device (must be a valid pointer).
-+ * @max_l2_slices: The maximum number of L2 slices.
-+ * @max_core_mask: The largest core mask.
-+ *
-+ * This function handles a stop event for the VM.
-+ * It will update the VM state and forward the stop event to the driver.
-+ */
-+void kbase_arbiter_set_max_config(struct kbase_device *kbdev,
-+				  uint32_t max_l2_slices,
-+				  uint32_t max_core_mask);
-+
-+/**
-+ * kbase_arbiter_pm_gpu_assigned() - Determine if this VM has access to the GPU
-+ * @kbdev: The kbase device structure for the device (must be a valid pointer)
-+ *
-+ * Return: 0 if the VM does not have access, 1 if it does, and a negative number
-+ * if an error occurred
-+ */
-+int kbase_arbiter_pm_gpu_assigned(struct kbase_device *kbdev);
-+
-+extern struct kbase_clk_rate_trace_op_conf arb_clk_rate_trace_ops;
-+
-+/**
-+ * struct kbase_arbiter_freq - Holding the GPU clock frequency data retrieved
-+ * from arbiter
-+ * @arb_freq:      GPU clock frequency value
-+ * @arb_freq_lock: Mutex protecting access to arbfreq value
-+ * @nb:            Notifier block to receive rate change callbacks
-+ * @freq_updated:  Flag to indicate whether a frequency changed has just been
-+ *                 communicated to avoid "GPU_GRANTED when not expected" warning
-+ */
-+struct kbase_arbiter_freq {
-+	uint32_t arb_freq;
-+	struct mutex arb_freq_lock;
-+	struct notifier_block *nb;
-+	bool freq_updated;
-+};
-+
-+/**
-+ * kbase_arbiter_pm_update_gpu_freq() - Update GPU frequency
-+ * @arb_freq: Pointer to GPU clock frequency data
-+ * @freq:     The new frequency
-+ *
-+ * Updates the GPU frequency and triggers any notifications
-+ */
-+void kbase_arbiter_pm_update_gpu_freq(struct kbase_arbiter_freq *arb_freq,
-+	uint32_t freq);
-+
- #endif /*_MALI_KBASE_ARBITER_PM_H_ */
-diff --git a/dvalin/kernel/drivers/gpu/arm/midgard/backend/gpu/Kbuild b/dvalin/kernel/drivers/gpu/arm/midgard/backend/gpu/Kbuild
-index 2449e80..5dbcff3 100644
---- a/dvalin/kernel/drivers/gpu/arm/midgard/backend/gpu/Kbuild
-+++ b/dvalin/kernel/drivers/gpu/arm/midgard/backend/gpu/Kbuild
-@@ -1,10 +1,11 @@
-+# SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note
- #
--# (C) COPYRIGHT 2014-2019 ARM Limited. All rights reserved.
-+# (C) COPYRIGHT 2014-2021 ARM Limited. All rights reserved.
- #
- # This program is free software and is provided to you under the terms of the
- # GNU General Public License version 2 as published by the Free Software
- # Foundation, and any use by you of this program is subject to the terms
--# of such GNU licence.
-+# of such GNU license.
- #
- # This program is distributed in the hope that it will be useful,
- # but WITHOUT ANY WARRANTY; without even the implied warranty of
-@@ -15,51 +16,34 @@
- # along with this program; if not, you can access it online at
- # http://www.gnu.org/licenses/gpl-2.0.html.
- #
--# SPDX-License-Identifier: GPL-2.0
--#
- #
- 
--BACKEND += \
--	backend/gpu/mali_kbase_cache_policy_backend.c \
--	backend/gpu/mali_kbase_device_hw.c \
--	backend/gpu/mali_kbase_gpuprops_backend.c \
--	backend/gpu/mali_kbase_irq_linux.c \
--	backend/gpu/mali_kbase_instr_backend.c \
--	backend/gpu/mali_kbase_js_backend.c \
--	backend/gpu/mali_kbase_pm_backend.c \
--	backend/gpu/mali_kbase_pm_driver.c \
--	backend/gpu/mali_kbase_pm_metrics.c \
--	backend/gpu/mali_kbase_pm_ca.c \
--	backend/gpu/mali_kbase_pm_always_on.c \
--	backend/gpu/mali_kbase_pm_coarse_demand.c \
--	backend/gpu/mali_kbase_pm_policy.c \
--	backend/gpu/mali_kbase_time.c \
--	backend/gpu/mali_kbase_l2_mmu_config.c
-+mali_kbase-y += \
-+    backend/gpu/mali_kbase_cache_policy_backend.o \
-+    backend/gpu/mali_kbase_gpuprops_backend.o \
-+    backend/gpu/mali_kbase_irq_linux.o \
-+    backend/gpu/mali_kbase_js_backend.o \
-+    backend/gpu/mali_kbase_pm_backend.o \
-+    backend/gpu/mali_kbase_pm_driver.o \
-+    backend/gpu/mali_kbase_pm_metrics.o \
-+    backend/gpu/mali_kbase_pm_ca.o \
-+    backend/gpu/mali_kbase_pm_always_on.o \
-+    backend/gpu/mali_kbase_pm_coarse_demand.o \
-+    backend/gpu/mali_kbase_pm_policy.o \
-+    backend/gpu/mali_kbase_time.o \
-+    backend/gpu/mali_kbase_l2_mmu_config.o \
-+    backend/gpu/mali_kbase_clk_rate_trace_mgr.o
- 
--ifeq ($(MALI_USE_CSF),1)
--# empty
--else
--	BACKEND += \
--		backend/gpu/mali_kbase_jm_as.c \
--		backend/gpu/mali_kbase_debug_job_fault_backend.c \
--		backend/gpu/mali_kbase_jm_hw.c \
--		backend/gpu/mali_kbase_jm_rb.c
-+ifeq ($(MALI_USE_CSF),0)
-+    mali_kbase-y += \
-+        backend/gpu/mali_kbase_instr_backend.o \
-+        backend/gpu/mali_kbase_jm_as.o \
-+        backend/gpu/mali_kbase_debug_job_fault_backend.o \
-+        backend/gpu/mali_kbase_jm_hw.o \
-+        backend/gpu/mali_kbase_jm_rb.o
- endif
- 
--ifeq ($(MALI_CUSTOMER_RELEASE),0)
--BACKEND += \
--	backend/gpu/mali_kbase_pm_always_on_demand.c
--endif
- 
--ifeq ($(CONFIG_MALI_DEVFREQ),y)
--BACKEND += \
--	backend/gpu/mali_kbase_devfreq.c
--endif
-+mali_kbase-$(CONFIG_MALI_DEVFREQ) += \
-+    backend/gpu/mali_kbase_devfreq.o
- 
--ifeq ($(CONFIG_MALI_NO_MALI),y)
--	# Dummy model
--	BACKEND += backend/gpu/mali_kbase_model_dummy.c
--	BACKEND += backend/gpu/mali_kbase_model_linux.c
--	# HW error simulation
--	BACKEND += backend/gpu/mali_kbase_model_error_generator.c
--endif
-diff --git a/dvalin/kernel/drivers/gpu/arm/midgard/backend/gpu/mali_kbase_backend_config.h b/dvalin/kernel/drivers/gpu/arm/midgard/backend/gpu/mali_kbase_backend_config.h
-index 4a61f96..6924fdb 100644
---- a/dvalin/kernel/drivers/gpu/arm/midgard/backend/gpu/mali_kbase_backend_config.h
-+++ b/dvalin/kernel/drivers/gpu/arm/midgard/backend/gpu/mali_kbase_backend_config.h
-@@ -1,11 +1,12 @@
-+/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
- /*
-  *
-- * (C) COPYRIGHT 2014-2018 ARM Limited. All rights reserved.
-+ * (C) COPYRIGHT 2014-2018, 2020-2021 ARM Limited. All rights reserved.
-  *
-  * This program is free software and is provided to you under the terms of the
-  * GNU General Public License version 2 as published by the Free Software
-  * Foundation, and any use by you of this program is subject to the terms
-- * of such GNU licence.
-+ * of such GNU license.
-  *
-  * This program is distributed in the hope that it will be useful,
-  * but WITHOUT ANY WARRANTY; without even the implied warranty of
-@@ -16,8 +17,6 @@
-  * along with this program; if not, you can access it online at
-  * http://www.gnu.org/licenses/gpl-2.0.html.
-  *
-- * SPDX-License-Identifier: GPL-2.0
-- *
-  */
- 
- /*
-diff --git a/dvalin/kernel/drivers/gpu/arm/midgard/backend/gpu/mali_kbase_cache_policy_backend.c b/dvalin/kernel/drivers/gpu/arm/midgard/backend/gpu/mali_kbase_cache_policy_backend.c
-index 7378bfd..e542ccf 100644
---- a/dvalin/kernel/drivers/gpu/arm/midgard/backend/gpu/mali_kbase_cache_policy_backend.c
-+++ b/dvalin/kernel/drivers/gpu/arm/midgard/backend/gpu/mali_kbase_cache_policy_backend.c
-@@ -1,11 +1,12 @@
-+// SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note
- /*
-  *
-- * (C) COPYRIGHT 2015-2016,2018 ARM Limited. All rights reserved.
-+ * (C) COPYRIGHT 2014-2016, 2018, 2020-2021 ARM Limited. All rights reserved.
-  *
-  * This program is free software and is provided to you under the terms of the
-  * GNU General Public License version 2 as published by the Free Software
-  * Foundation, and any use by you of this program is subject to the terms
-- * of such GNU licence.
-+ * of such GNU license.
-  *
-  * This program is distributed in the hope that it will be useful,
-  * but WITHOUT ANY WARRANTY; without even the implied warranty of
-@@ -16,12 +17,10 @@
-  * along with this program; if not, you can access it online at
-  * http://www.gnu.org/licenses/gpl-2.0.html.
-  *
-- * SPDX-License-Identifier: GPL-2.0
-- *
-  */
- 
- #include "backend/gpu/mali_kbase_cache_policy_backend.h"
--#include <backend/gpu/mali_kbase_device_internal.h>
-+#include <device/mali_kbase_device.h>
- 
- void kbase_cache_set_coherency_mode(struct kbase_device *kbdev,
- 		u32 mode)
-diff --git a/dvalin/kernel/drivers/gpu/arm/midgard/backend/gpu/mali_kbase_cache_policy_backend.h b/dvalin/kernel/drivers/gpu/arm/midgard/backend/gpu/mali_kbase_cache_policy_backend.h
-index f78ada7..278125a 100644
---- a/dvalin/kernel/drivers/gpu/arm/midgard/backend/gpu/mali_kbase_cache_policy_backend.h
-+++ b/dvalin/kernel/drivers/gpu/arm/midgard/backend/gpu/mali_kbase_cache_policy_backend.h
-@@ -1,11 +1,12 @@
-+/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
- /*
-  *
-- * (C) COPYRIGHT 2015-2016 ARM Limited. All rights reserved.
-+ * (C) COPYRIGHT 2014-2016, 2020-2021 ARM Limited. All rights reserved.
-  *
-  * This program is free software and is provided to you under the terms of the
-  * GNU General Public License version 2 as published by the Free Software
-  * Foundation, and any use by you of this program is subject to the terms
-- * of such GNU licence.
-+ * of such GNU license.
-  *
-  * This program is distributed in the hope that it will be useful,
-  * but WITHOUT ANY WARRANTY; without even the implied warranty of
-@@ -16,16 +17,13 @@
-  * along with this program; if not, you can access it online at
-  * http://www.gnu.org/licenses/gpl-2.0.html.
-  *
-- * SPDX-License-Identifier: GPL-2.0
-- *
-  */
- 
--
- #ifndef _KBASE_CACHE_POLICY_BACKEND_H_
- #define _KBASE_CACHE_POLICY_BACKEND_H_
- 
- #include "mali_kbase.h"
--#include "mali_base_kernel.h"
-+#include <uapi/gpu/arm/midgard/mali_base_kernel.h>
- 
- /**
-   * kbase_cache_set_coherency_mode() - Sets the system coherency mode
-diff --git a/dvalin/kernel/drivers/gpu/arm/midgard/backend/gpu/mali_kbase_clk_rate_trace_mgr.c b/dvalin/kernel/drivers/gpu/arm/midgard/backend/gpu/mali_kbase_clk_rate_trace_mgr.c
-new file mode 100644
-index 0000000..6ad0f58
---- /dev/null
-+++ b/dvalin/kernel/drivers/gpu/arm/midgard/backend/gpu/mali_kbase_clk_rate_trace_mgr.c
-@@ -0,0 +1,325 @@
-+// SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note
-+/*
-+ *
-+ * (C) COPYRIGHT 2020-2021 ARM Limited. All rights reserved.
-+ *
-+ * This program is free software and is provided to you under the terms of the
-+ * GNU General Public License version 2 as published by the Free Software
-+ * Foundation, and any use by you of this program is subject to the terms
-+ * of such GNU license.
-+ *
-+ * This program is distributed in the hope that it will be useful,
-+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
-+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-+ * GNU General Public License for more details.
-+ *
-+ * You should have received a copy of the GNU General Public License
-+ * along with this program; if not, you can access it online at
-+ * http://www.gnu.org/licenses/gpl-2.0.html.
-+ *
-+ */
-+
-+/*
-+ * Implementation of the GPU clock rate trace manager.
-+ */
-+
-+#include <mali_kbase.h>
-+#include <mali_kbase_config_defaults.h>
-+#include <linux/clk.h>
-+#include <asm/div64.h>
-+#include "backend/gpu/mali_kbase_clk_rate_trace_mgr.h"
-+
-+#ifdef CONFIG_TRACE_POWER_GPU_FREQUENCY
-+#include <trace/events/power_gpu_frequency.h>
-+#else
-+#include "mali_power_gpu_frequency_trace.h"
-+#endif
-+
-+#ifndef CLK_RATE_TRACE_OPS
-+#define CLK_RATE_TRACE_OPS (NULL)
-+#endif
-+
-+/**
-+ * get_clk_rate_trace_callbacks() - Returns pointer to clk trace ops.
-+ * @kbdev: Pointer to kbase device, used to check if arbitration is enabled
-+ *         when compiled with arbiter support.
-+ * Return: Pointer to clk trace ops if supported or NULL.
-+ */
-+static struct kbase_clk_rate_trace_op_conf *
-+get_clk_rate_trace_callbacks(struct kbase_device *kbdev __maybe_unused)
-+{
-+	/* base case */
-+	struct kbase_clk_rate_trace_op_conf *callbacks =
-+		(struct kbase_clk_rate_trace_op_conf *)CLK_RATE_TRACE_OPS;
-+#if defined(CONFIG_MALI_ARBITER_SUPPORT) && defined(CONFIG_OF)
-+	const void *arbiter_if_node;
-+
-+	if (WARN_ON(!kbdev) || WARN_ON(!kbdev->dev))
-+		return callbacks;
-+
-+	arbiter_if_node =
-+		of_get_property(kbdev->dev->of_node, "arbiter_if", NULL);
-+	/* Arbitration enabled, override the callback pointer.*/
-+	if (arbiter_if_node)
-+		callbacks = &arb_clk_rate_trace_ops;
-+	else
-+		dev_dbg(kbdev->dev,
-+			"Arbitration supported but disabled by platform. Leaving clk rate callbacks as default.\n");
-+
-+#endif
-+
-+	return callbacks;
-+}
-+
-+static int gpu_clk_rate_change_notifier(struct notifier_block *nb,
-+			unsigned long event, void *data)
-+{
-+	struct kbase_gpu_clk_notifier_data *ndata = data;
-+	struct kbase_clk_data *clk_data =
-+		container_of(nb, struct kbase_clk_data, clk_rate_change_nb);
-+	struct kbase_clk_rate_trace_manager *clk_rtm = clk_data->clk_rtm;
-+	unsigned long flags;
-+
-+	if (WARN_ON_ONCE(clk_data->gpu_clk_handle != ndata->gpu_clk_handle))
-+		return NOTIFY_BAD;
-+
-+	spin_lock_irqsave(&clk_rtm->lock, flags);
-+	if (event == POST_RATE_CHANGE) {
-+		if (!clk_rtm->gpu_idle &&
-+		    (clk_data->clock_val != ndata->new_rate)) {
-+			kbase_clk_rate_trace_manager_notify_all(
-+				clk_rtm, clk_data->index, ndata->new_rate);
-+		}
-+
-+		clk_data->clock_val = ndata->new_rate;
-+	}
-+	spin_unlock_irqrestore(&clk_rtm->lock, flags);
-+
-+	return NOTIFY_DONE;
-+}
-+
-+static int gpu_clk_data_init(struct kbase_device *kbdev,
-+		void *gpu_clk_handle, unsigned int index)
-+{
-+	struct kbase_clk_rate_trace_op_conf *callbacks;
-+	struct kbase_clk_data *clk_data;
-+	struct kbase_clk_rate_trace_manager *clk_rtm = &kbdev->pm.clk_rtm;
-+	int ret = 0;
-+
-+	callbacks = get_clk_rate_trace_callbacks(kbdev);
-+
-+	if (WARN_ON(!callbacks) ||
-+	    WARN_ON(!gpu_clk_handle) ||
-+	    WARN_ON(index >= BASE_MAX_NR_CLOCKS_REGULATORS))
-+		return -EINVAL;
-+
-+	clk_data = kzalloc(sizeof(*clk_data), GFP_KERNEL);
-+	if (!clk_data) {
-+		dev_err(kbdev->dev, "Failed to allocate data for clock enumerated at index %u", index);
-+		return -ENOMEM;
-+	}
-+
-+	clk_data->index = (u8)index;
-+	clk_data->gpu_clk_handle = gpu_clk_handle;
-+	/* Store the initial value of clock */
-+	clk_data->clock_val =
-+		callbacks->get_gpu_clk_rate(kbdev, gpu_clk_handle);
-+
-+	{
-+		/* At the initialization time, GPU is powered off. */
-+		unsigned long flags;
-+
-+		spin_lock_irqsave(&clk_rtm->lock, flags);
-+		kbase_clk_rate_trace_manager_notify_all(
-+			clk_rtm, clk_data->index, 0);
-+		spin_unlock_irqrestore(&clk_rtm->lock, flags);
-+	}
-+
-+	clk_data->clk_rtm = clk_rtm;
-+	clk_rtm->clks[index] = clk_data;
-+
-+	clk_data->clk_rate_change_nb.notifier_call =
-+			gpu_clk_rate_change_notifier;
-+
-+	if (callbacks->gpu_clk_notifier_register)
-+		ret = callbacks->gpu_clk_notifier_register(kbdev,
-+				gpu_clk_handle, &clk_data->clk_rate_change_nb);
-+	if (ret) {
-+		dev_err(kbdev->dev, "Failed to register notifier for clock enumerated at index %u", index);
-+		kfree(clk_data);
-+	}
-+
-+	return ret;
-+}
-+
-+int kbase_clk_rate_trace_manager_init(struct kbase_device *kbdev)
-+{
-+	struct kbase_clk_rate_trace_op_conf *callbacks;
-+	struct kbase_clk_rate_trace_manager *clk_rtm = &kbdev->pm.clk_rtm;
-+	unsigned int i;
-+	int ret = 0;
-+
-+	callbacks = get_clk_rate_trace_callbacks(kbdev);
-+
-+	spin_lock_init(&clk_rtm->lock);
-+	INIT_LIST_HEAD(&clk_rtm->listeners);
-+
-+	/* Return early if no callbacks provided for clock rate tracing */
-+	if (!callbacks) {
-+		WRITE_ONCE(clk_rtm->clk_rate_trace_ops, NULL);
-+		return 0;
-+	}
-+
-+	clk_rtm->gpu_idle = true;
-+
-+	for (i = 0; i < BASE_MAX_NR_CLOCKS_REGULATORS; i++) {
-+		void *gpu_clk_handle =
-+			callbacks->enumerate_gpu_clk(kbdev, i);
-+
-+		if (!gpu_clk_handle)
-+			break;
-+
-+		ret = gpu_clk_data_init(kbdev, gpu_clk_handle, i);
-+		if (ret)
-+			goto error;
-+	}
-+
-+	/* Activate clock rate trace manager if at least one GPU clock was
-+	 * enumerated.
-+	 */
-+	if (i) {
-+		WRITE_ONCE(clk_rtm->clk_rate_trace_ops, callbacks);
-+	} else {
-+		dev_info(kbdev->dev, "No clock(s) available for rate tracing");
-+		WRITE_ONCE(clk_rtm->clk_rate_trace_ops, NULL);
-+	}
-+
-+	return 0;
-+
-+error:
-+	while (i--) {
-+		clk_rtm->clk_rate_trace_ops->gpu_clk_notifier_unregister(
-+				kbdev, clk_rtm->clks[i]->gpu_clk_handle,
-+				&clk_rtm->clks[i]->clk_rate_change_nb);
-+		kfree(clk_rtm->clks[i]);
-+	}
-+
-+	return ret;
-+}
-+
-+void kbase_clk_rate_trace_manager_term(struct kbase_device *kbdev)
-+{
-+	struct kbase_clk_rate_trace_manager *clk_rtm = &kbdev->pm.clk_rtm;
-+	unsigned int i;
-+
-+	WARN_ON(!list_empty(&clk_rtm->listeners));
-+
-+	if (!clk_rtm->clk_rate_trace_ops)
-+		return;
-+
-+	for (i = 0; i < BASE_MAX_NR_CLOCKS_REGULATORS; i++) {
-+		if (!clk_rtm->clks[i])
-+			break;
-+
-+		if (clk_rtm->clk_rate_trace_ops->gpu_clk_notifier_unregister)
-+			clk_rtm->clk_rate_trace_ops->gpu_clk_notifier_unregister
-+			(kbdev, clk_rtm->clks[i]->gpu_clk_handle,
-+			&clk_rtm->clks[i]->clk_rate_change_nb);
-+		kfree(clk_rtm->clks[i]);
-+	}
-+
-+	WRITE_ONCE(clk_rtm->clk_rate_trace_ops, NULL);
-+}
-+
-+void kbase_clk_rate_trace_manager_gpu_active(struct kbase_device *kbdev)
-+{
-+	struct kbase_clk_rate_trace_manager *clk_rtm = &kbdev->pm.clk_rtm;
-+	unsigned int i;
-+	unsigned long flags;
-+
-+	if (!clk_rtm->clk_rate_trace_ops)
-+		return;
-+
-+	spin_lock_irqsave(&clk_rtm->lock, flags);
-+
-+	for (i = 0; i < BASE_MAX_NR_CLOCKS_REGULATORS; i++) {
-+		struct kbase_clk_data *clk_data = clk_rtm->clks[i];
-+
-+		if (!clk_data)
-+			break;
-+
-+		if (unlikely(!clk_data->clock_val))
-+			continue;
-+
-+		kbase_clk_rate_trace_manager_notify_all(
-+			clk_rtm, clk_data->index, clk_data->clock_val);
-+	}
-+
-+	clk_rtm->gpu_idle = false;
-+	spin_unlock_irqrestore(&clk_rtm->lock, flags);
-+}
-+
-+void kbase_clk_rate_trace_manager_gpu_idle(struct kbase_device *kbdev)
-+{
-+	struct kbase_clk_rate_trace_manager *clk_rtm = &kbdev->pm.clk_rtm;
-+	unsigned int i;
-+	unsigned long flags;
-+
-+	if (!clk_rtm->clk_rate_trace_ops)
-+		return;
-+
-+	spin_lock_irqsave(&clk_rtm->lock, flags);
-+
-+	for (i = 0; i < BASE_MAX_NR_CLOCKS_REGULATORS; i++) {
-+		struct kbase_clk_data *clk_data = clk_rtm->clks[i];
-+
-+		if (!clk_data)
-+			break;
-+
-+		if (unlikely(!clk_data->clock_val))
-+			continue;
-+
-+		kbase_clk_rate_trace_manager_notify_all(
-+			clk_rtm, clk_data->index, 0);
-+	}
-+
-+	clk_rtm->gpu_idle = true;
-+	spin_unlock_irqrestore(&clk_rtm->lock, flags);
-+}
-+
-+void kbase_clk_rate_trace_manager_notify_all(
-+	struct kbase_clk_rate_trace_manager *clk_rtm,
-+	u32 clk_index,
-+	unsigned long new_rate)
-+{
-+	struct kbase_clk_rate_listener *pos;
-+	struct kbase_device *kbdev;
-+
-+	lockdep_assert_held(&clk_rtm->lock);
-+
-+	kbdev = container_of(clk_rtm, struct kbase_device, pm.clk_rtm);
-+
-+	dev_dbg(kbdev->dev, "%s - GPU clock %u rate changed to %lu, pid: %d",
-+		__func__, clk_index, new_rate, current->pid);
-+
-+	/* Raise standard `power/gpu_frequency` ftrace event */
-+	{
-+		unsigned long new_rate_khz = new_rate;
-+
-+#if BITS_PER_LONG == 64
-+		do_div(new_rate_khz, 1000);
-+#elif BITS_PER_LONG == 32
-+		new_rate_khz /= 1000;
-+#else
-+#error "unsigned long division is not supported for this architecture"
-+#endif
-+
-+		trace_gpu_frequency(new_rate_khz, clk_index);
-+	}
-+
-+	/* Notify the listeners. */
-+	list_for_each_entry(pos, &clk_rtm->listeners, node) {
-+		pos->notify(pos, clk_index, new_rate);
-+	}
-+}
-+KBASE_EXPORT_TEST_API(kbase_clk_rate_trace_manager_notify_all);
-diff --git a/dvalin/kernel/drivers/gpu/arm/midgard/backend/gpu/mali_kbase_clk_rate_trace_mgr.h b/dvalin/kernel/drivers/gpu/arm/midgard/backend/gpu/mali_kbase_clk_rate_trace_mgr.h
-new file mode 100644
-index 0000000..f7ec9d1
---- /dev/null
-+++ b/dvalin/kernel/drivers/gpu/arm/midgard/backend/gpu/mali_kbase_clk_rate_trace_mgr.h
-@@ -0,0 +1,154 @@
-+/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
-+/*
-+ *
-+ * (C) COPYRIGHT 2020-2021 ARM Limited. All rights reserved.
-+ *
-+ * This program is free software and is provided to you under the terms of the
-+ * GNU General Public License version 2 as published by the Free Software
-+ * Foundation, and any use by you of this program is subject to the terms
-+ * of such GNU license.
-+ *
-+ * This program is distributed in the hope that it will be useful,
-+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
-+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-+ * GNU General Public License for more details.
-+ *
-+ * You should have received a copy of the GNU General Public License
-+ * along with this program; if not, you can access it online at
-+ * http://www.gnu.org/licenses/gpl-2.0.html.
-+ *
-+ */
-+
-+#ifndef _KBASE_CLK_RATE_TRACE_MGR_
-+#define _KBASE_CLK_RATE_TRACE_MGR_
-+
-+/* The index of top clock domain in kbase_clk_rate_trace_manager:clks. */
-+#define KBASE_CLOCK_DOMAIN_TOP (0)
-+
-+/* The index of shader-cores clock domain in
-+ * kbase_clk_rate_trace_manager:clks.
-+ */
-+#define KBASE_CLOCK_DOMAIN_SHADER_CORES (1)
-+
-+/**
-+ * struct kbase_clk_data - Data stored per enumerated GPU clock.
-+ *
-+ * @clk_rtm:            Pointer to clock rate trace manager object.
-+ * @gpu_clk_handle:     Handle unique to the enumerated GPU clock.
-+ * @plat_private:       Private data for the platform to store into
-+ * @clk_rate_change_nb: notifier block containing the pointer to callback
-+ *                      function that is invoked whenever the rate of
-+ *                      enumerated GPU clock changes.
-+ * @clock_val:          Current rate of the enumerated GPU clock.
-+ * @index:              Index at which the GPU clock was enumerated.
-+ */
-+struct kbase_clk_data {
-+	struct kbase_clk_rate_trace_manager *clk_rtm;
-+	void *gpu_clk_handle;
-+	void *plat_private;
-+	struct notifier_block clk_rate_change_nb;
-+	unsigned long clock_val;
-+	u8 index;
-+};
-+
-+/**
-+ * kbase_clk_rate_trace_manager_init - Initialize GPU clock rate trace manager.
-+ *
-+ * @kbdev:      Device pointer
-+ *
-+ * Return: 0 if success, or an error code on failure.
-+ */
-+int kbase_clk_rate_trace_manager_init(struct kbase_device *kbdev);
-+
-+/**
-+ * kbase_clk_rate_trace_manager_term - Terminate GPU clock rate trace manager.
-+ *
-+ *  @kbdev:      Device pointer
-+ */
-+void kbase_clk_rate_trace_manager_term(struct kbase_device *kbdev);
-+
-+/**
-+ * kbase_clk_rate_trace_manager_gpu_active - Inform GPU clock rate trace
-+ *                                           manager of GPU becoming active.
-+ *
-+ * @kbdev:      Device pointer
-+ */
-+void kbase_clk_rate_trace_manager_gpu_active(struct kbase_device *kbdev);
-+
-+/**
-+ * kbase_clk_rate_trace_manager_gpu_idle - Inform GPU clock rate trace
-+ *                                         manager of GPU becoming idle.
-+ * @kbdev:      Device pointer
-+ */
-+void kbase_clk_rate_trace_manager_gpu_idle(struct kbase_device *kbdev);
-+
-+/**
-+ * kbase_clk_rate_trace_manager_subscribe_no_lock() - Add freq change listener.
-+ *
-+ * @clk_rtm:    Clock rate manager instance.
-+ * @listener:   Listener handle
-+ *
-+ * kbase_clk_rate_trace_manager:lock must be held by the caller.
-+ */
-+static inline void kbase_clk_rate_trace_manager_subscribe_no_lock(
-+	struct kbase_clk_rate_trace_manager *clk_rtm,
-+	struct kbase_clk_rate_listener *listener)
-+{
-+	lockdep_assert_held(&clk_rtm->lock);
-+	list_add(&listener->node, &clk_rtm->listeners);
-+}
-+
-+/**
-+ * kbase_clk_rate_trace_manager_subscribe() - Add freq change listener.
-+ *
-+ * @clk_rtm:    Clock rate manager instance.
-+ * @listener:   Listener handle
-+ */
-+static inline void kbase_clk_rate_trace_manager_subscribe(
-+	struct kbase_clk_rate_trace_manager *clk_rtm,
-+	struct kbase_clk_rate_listener *listener)
-+{
-+	unsigned long flags;
-+
-+	spin_lock_irqsave(&clk_rtm->lock, flags);
-+	kbase_clk_rate_trace_manager_subscribe_no_lock(
-+		clk_rtm, listener);
-+	spin_unlock_irqrestore(&clk_rtm->lock, flags);
-+}
-+
-+/**
-+ * kbase_clk_rate_trace_manager_unsubscribe() - Remove freq change listener.
-+ *
-+ * @clk_rtm:    Clock rate manager instance.
-+ * @listener:   Listener handle
-+ */
-+static inline void kbase_clk_rate_trace_manager_unsubscribe(
-+	struct kbase_clk_rate_trace_manager *clk_rtm,
-+	struct kbase_clk_rate_listener *listener)
-+{
-+	unsigned long flags;
-+
-+	spin_lock_irqsave(&clk_rtm->lock, flags);
-+	list_del(&listener->node);
-+	spin_unlock_irqrestore(&clk_rtm->lock, flags);
-+}
-+
-+/**
-+ * kbase_clk_rate_trace_manager_notify_all() - Notify all clock \
-+ *                                             rate listeners.
-+ *
-+ * @clk_rtm:     Clock rate manager instance.
-+ * @clock_index:   Clock index.
-+ * @new_rate:    New clock frequency(Hz)
-+ *
-+ * kbase_clk_rate_trace_manager:lock must be locked.
-+ * This function is exported to be used by clock rate trace test
-+ * portal.
-+ */
-+void kbase_clk_rate_trace_manager_notify_all(
-+	struct kbase_clk_rate_trace_manager *clk_rtm,
-+	u32 clock_index,
-+	unsigned long new_rate);
-+
-+#endif /* _KBASE_CLK_RATE_TRACE_MGR_ */
-+
-diff --git a/dvalin/kernel/drivers/gpu/arm/midgard/backend/gpu/mali_kbase_debug_job_fault_backend.c b/dvalin/kernel/drivers/gpu/arm/midgard/backend/gpu/mali_kbase_debug_job_fault_backend.c
-index b05844e..e121b41 100644
---- a/dvalin/kernel/drivers/gpu/arm/midgard/backend/gpu/mali_kbase_debug_job_fault_backend.c
-+++ b/dvalin/kernel/drivers/gpu/arm/midgard/backend/gpu/mali_kbase_debug_job_fault_backend.c
-@@ -1,11 +1,12 @@
-+// SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note
- /*
-  *
-- * (C) COPYRIGHT 2012-2015,2018-2019 ARM Limited. All rights reserved.
-+ * (C) COPYRIGHT 2012-2015, 2018-2021 ARM Limited. All rights reserved.
-  *
-  * This program is free software and is provided to you under the terms of the
-  * GNU General Public License version 2 as published by the Free Software
-  * Foundation, and any use by you of this program is subject to the terms
-- * of such GNU licence.
-+ * of such GNU license.
-  *
-  * This program is distributed in the hope that it will be useful,
-  * but WITHOUT ANY WARRANTY; without even the implied warranty of
-@@ -16,15 +17,13 @@
-  * along with this program; if not, you can access it online at
-  * http://www.gnu.org/licenses/gpl-2.0.html.
-  *
-- * SPDX-License-Identifier: GPL-2.0
-- *
-  */
- 
- #include <mali_kbase.h>
--#include <backend/gpu/mali_kbase_device_internal.h>
-+#include <device/mali_kbase_device.h>
- #include "mali_kbase_debug_job_fault.h"
- 
--#ifdef CONFIG_DEBUG_FS
-+#if IS_ENABLED(CONFIG_DEBUG_FS)
- 
- /*GPU_CONTROL_REG(r)*/
- static int gpu_control_reg_snapshot[] = {
-diff --git a/dvalin/kernel/drivers/gpu/arm/midgard/backend/gpu/mali_kbase_devfreq.c b/dvalin/kernel/drivers/gpu/arm/midgard/backend/gpu/mali_kbase_devfreq.c
-index 2806f05..8c31499 100644
---- a/dvalin/kernel/drivers/gpu/arm/midgard/backend/gpu/mali_kbase_devfreq.c
-+++ b/dvalin/kernel/drivers/gpu/arm/midgard/backend/gpu/mali_kbase_devfreq.c
-@@ -1,11 +1,12 @@
-+// SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note
- /*
-  *
-- * (C) COPYRIGHT 2014-2020 ARM Limited. All rights reserved.
-+ * (C) COPYRIGHT 2014-2021 ARM Limited. All rights reserved.
-  *
-  * This program is free software and is provided to you under the terms of the
-  * GNU General Public License version 2 as published by the Free Software
-  * Foundation, and any use by you of this program is subject to the terms
-- * of such GNU licence.
-+ * of such GNU license.
-  *
-  * This program is distributed in the hope that it will be useful,
-  * but WITHOUT ANY WARRANTY; without even the implied warranty of
-@@ -16,8 +17,6 @@
-  * along with this program; if not, you can access it online at
-  * http://www.gnu.org/licenses/gpl-2.0.html.
-  *
-- * SPDX-License-Identifier: GPL-2.0
-- *
-  */
- 
- #include <mali_kbase.h>
-@@ -27,40 +26,53 @@
- #include <linux/of.h>
- #include <linux/clk.h>
- #include <linux/devfreq.h>
--#ifdef CONFIG_DEVFREQ_THERMAL
-+#if IS_ENABLED(CONFIG_DEVFREQ_THERMAL)
- #include <linux/devfreq_cooling.h>
- #endif
- 
- #include <linux/version.h>
--#if LINUX_VERSION_CODE >= KERNEL_VERSION(3, 13, 0)
- #include <linux/pm_opp.h>
--#else /* Linux >= 3.13 */
--/* In 3.13 the OPP include header file, types, and functions were all
-- * renamed. Use the old filename for the include, and define the new names to
-- * the old, when an old kernel is detected.
-- */
--#include <linux/opp.h>
--#define dev_pm_opp opp
--#define dev_pm_opp_get_voltage opp_get_voltage
--#define dev_pm_opp_get_opp_count opp_get_opp_count
--#define dev_pm_opp_find_freq_ceil opp_find_freq_ceil
--#define dev_pm_opp_find_freq_floor opp_find_freq_floor
--#endif /* Linux >= 3.13 */
- 
- /**
-- * opp_translate - Translate nominal OPP frequency from devicetree into real
-- *                 frequency and core mask
-- * @kbdev:     Device pointer
-- * @freq:      Nominal frequency
-- * @core_mask: Pointer to u64 to store core mask to
-- * @freqs:     Pointer to array of frequencies
-- * @volts:     Pointer to array of voltages
-+ * get_voltage() - Get the voltage value corresponding to the nominal frequency
-+ *                 used by devfreq.
-+ * @kbdev:    Device pointer
-+ * @freq:     Nominal frequency in Hz passed by devfreq.
-+ *
-+ * This function will be called only when the opp table which is compatible with
-+ * "operating-points-v2-mali", is not present in the devicetree for GPU device.
-  *
-- * This function will only perform translation if an operating-points-v2-mali
-- * table is present in devicetree. If one is not present then it will return an
-- * untranslated frequency and all cores enabled.
-+ * Return: Voltage value in milli volts, 0 in case of error.
-  */
--static void opp_translate(struct kbase_device *kbdev, unsigned long freq,
-+static unsigned long get_voltage(struct kbase_device *kbdev, unsigned long freq)
-+{
-+	struct dev_pm_opp *opp;
-+	unsigned long voltage = 0;
-+
-+#if KERNEL_VERSION(4, 11, 0) > LINUX_VERSION_CODE
-+	rcu_read_lock();
-+#endif
-+
-+	opp = dev_pm_opp_find_freq_exact(kbdev->dev, freq, true);
-+
-+	if (IS_ERR_OR_NULL(opp))
-+		dev_err(kbdev->dev, "Failed to get opp (%ld)\n", PTR_ERR(opp));
-+	else {
-+		voltage = dev_pm_opp_get_voltage(opp);
-+#if KERNEL_VERSION(4, 11, 0) <= LINUX_VERSION_CODE
-+		dev_pm_opp_put(opp);
-+#endif
-+	}
-+
-+#if KERNEL_VERSION(4, 11, 0) > LINUX_VERSION_CODE
-+	rcu_read_unlock();
-+#endif
-+
-+	/* Return the voltage in milli volts */
-+	return voltage / 1000;
-+}
-+
-+void kbase_devfreq_opp_translate(struct kbase_device *kbdev, unsigned long freq,
- 	u64 *core_mask, unsigned long *freqs, unsigned long *volts)
- {
- 	unsigned int i;
-@@ -82,12 +94,17 @@ static void opp_translate(struct kbase_device *kbdev, unsigned long freq,
- 	}
- 
- 	/* If failed to find OPP, return all cores enabled
--	 * and nominal frequency
-+	 * and nominal frequency and the corresponding voltage.
- 	 */
- 	if (i == kbdev->num_opps) {
-+		unsigned long voltage = get_voltage(kbdev, freq);
-+
- 		*core_mask = kbdev->gpu_props.props.raw_props.shader_present;
--		for (i = 0; i < kbdev->nr_clocks; i++)
-+
-+		for (i = 0; i < kbdev->nr_clocks; i++) {
- 			freqs[i] = freq;
-+			volts[i] = voltage;
-+		}
- 	}
- }
- 
-@@ -104,18 +121,18 @@ kbase_devfreq_target(struct device *dev, unsigned long *target_freq, u32 flags)
- 
- 	nominal_freq = *target_freq;
- 
--#if LINUX_VERSION_CODE < KERNEL_VERSION(4, 11, 0)
-+#if KERNEL_VERSION(4, 11, 0) > LINUX_VERSION_CODE
- 	rcu_read_lock();
- #endif
- 	opp = devfreq_recommended_opp(dev, &nominal_freq, flags);
--#if LINUX_VERSION_CODE < KERNEL_VERSION(4, 11, 0)
-+#if KERNEL_VERSION(4, 11, 0) > LINUX_VERSION_CODE
- 	rcu_read_unlock();
- #endif
- 	if (IS_ERR_OR_NULL(opp)) {
- 		dev_err(dev, "Failed to get opp (%ld)\n", PTR_ERR(opp));
- 		return PTR_ERR(opp);
- 	}
--#if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 11, 0)
-+#if KERNEL_VERSION(4, 11, 0) <= LINUX_VERSION_CODE
- 	dev_pm_opp_put(opp);
- #endif
- 
-@@ -127,9 +144,10 @@ kbase_devfreq_target(struct device *dev, unsigned long *target_freq, u32 flags)
- 		return 0;
- 	}
- 
--	opp_translate(kbdev, nominal_freq, &core_mask, freqs, volts);
-+	kbase_devfreq_opp_translate(kbdev, nominal_freq, &core_mask,
-+				    freqs, volts);
- 
--#ifdef CONFIG_REGULATOR
-+#if IS_ENABLED(CONFIG_REGULATOR)
- 	/* Regulators and clocks work in pairs: every clock has a regulator,
- 	 * and we never expect to have more regulators than clocks.
- 	 *
-@@ -177,7 +195,7 @@ kbase_devfreq_target(struct device *dev, unsigned long *target_freq, u32 flags)
- 		}
- 	}
- 
--#ifdef CONFIG_REGULATOR
-+#if IS_ENABLED(CONFIG_REGULATOR)
- 	for (i = 0; i < kbdev->nr_clocks; i++) {
- 		if (kbdev->regulators[i] &&
- 				kbdev->current_voltages[i] != volts[i] &&
-@@ -238,6 +256,10 @@ kbase_devfreq_status(struct device *dev, struct devfreq_dev_status *stat)
- 	stat->current_frequency = kbdev->current_nominal_freq;
- 	stat->private_data = NULL;
- 
-+#if MALI_USE_CSF && defined CONFIG_DEVFREQ_THERMAL
-+	kbase_ipa_reset_data(kbdev);
-+#endif
-+
- 	return 0;
- }
- 
-@@ -249,11 +271,11 @@ static int kbase_devfreq_init_freq_table(struct kbase_device *kbdev,
- 	unsigned long freq;
- 	struct dev_pm_opp *opp;
- 
--#if LINUX_VERSION_CODE < KERNEL_VERSION(4, 11, 0)
-+#if KERNEL_VERSION(4, 11, 0) > LINUX_VERSION_CODE
- 	rcu_read_lock();
- #endif
- 	count = dev_pm_opp_get_opp_count(kbdev->dev);
--#if LINUX_VERSION_CODE < KERNEL_VERSION(4, 11, 0)
-+#if KERNEL_VERSION(4, 11, 0) > LINUX_VERSION_CODE
- 	rcu_read_unlock();
- #endif
- 	if (count < 0)
-@@ -264,20 +286,20 @@ static int kbase_devfreq_init_freq_table(struct kbase_device *kbdev,
- 	if (!dp->freq_table)
- 		return -ENOMEM;
- 
--#if LINUX_VERSION_CODE < KERNEL_VERSION(4, 11, 0)
-+#if KERNEL_VERSION(4, 11, 0) > LINUX_VERSION_CODE
- 	rcu_read_lock();
- #endif
- 	for (i = 0, freq = ULONG_MAX; i < count; i++, freq--) {
- 		opp = dev_pm_opp_find_freq_floor(kbdev->dev, &freq);
- 		if (IS_ERR(opp))
- 			break;
--#if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 11, 0)
-+#if KERNEL_VERSION(4, 11, 0) <= LINUX_VERSION_CODE
- 		dev_pm_opp_put(opp);
--#endif /* LINUX_VERSION_CODE >= KERNEL_VERSION(4, 11, 0) */
-+#endif /* KERNEL_VERSION(4, 11, 0) <= LINUX_VERSION_CODE */
- 
- 		dp->freq_table[i] = freq;
- 	}
--#if LINUX_VERSION_CODE < KERNEL_VERSION(4, 11, 0)
-+#if KERNEL_VERSION(4, 11, 0) > LINUX_VERSION_CODE
- 	rcu_read_unlock();
- #endif
- 
-@@ -309,18 +331,21 @@ static void kbase_devfreq_term_freq_table(struct kbase_device *kbdev)
- 	struct devfreq_dev_profile *dp = &kbdev->devfreq_profile;
- 
- 	kfree(dp->freq_table);
-+	dp->freq_table = NULL;
- }
- 
- static void kbase_devfreq_term_core_mask_table(struct kbase_device *kbdev)
- {
- 	kfree(kbdev->devfreq_table);
-+	kbdev->devfreq_table = NULL;
- }
- 
- static void kbase_devfreq_exit(struct device *dev)
- {
- 	struct kbase_device *kbdev = dev_get_drvdata(dev);
- 
--	kbase_devfreq_term_freq_table(kbdev);
-+	if (kbdev)
-+		kbase_devfreq_term_freq_table(kbdev);
- }
- 
- static void kbasep_devfreq_read_suspend_clock(struct kbase_device *kbdev,
-@@ -359,7 +384,7 @@ static void kbasep_devfreq_read_suspend_clock(struct kbase_device *kbdev,
- 
- static int kbase_devfreq_init_core_mask_table(struct kbase_device *kbdev)
- {
--#if KERNEL_VERSION(3, 18, 0) > LINUX_VERSION_CODE || !defined(CONFIG_OF)
-+#ifndef CONFIG_OF
- 	/* OPP table initialization requires at least the capability to get
- 	 * regulators and clocks from the device tree, as well as parsing
- 	 * arrays of unsigned integer values.
-@@ -392,7 +417,7 @@ static int kbase_devfreq_init_core_mask_table(struct kbase_device *kbdev)
- 		u64 core_mask, opp_freq,
- 			real_freqs[BASE_MAX_NR_CLOCKS_REGULATORS];
- 		int err;
--#ifdef CONFIG_REGULATOR
-+#if IS_ENABLED(CONFIG_REGULATOR)
- 		u32 opp_volts[BASE_MAX_NR_CLOCKS_REGULATORS];
- #endif
- 
-@@ -420,7 +445,7 @@ static int kbase_devfreq_init_core_mask_table(struct kbase_device *kbdev)
- 					err);
- 			continue;
- 		}
--#ifdef CONFIG_REGULATOR
-+#if IS_ENABLED(CONFIG_REGULATOR)
- 		err = of_property_read_u32_array(node,
- 			"opp-microvolt", opp_volts, kbdev->nr_regulators);
- 		if (err < 0) {
-@@ -474,7 +499,7 @@ static int kbase_devfreq_init_core_mask_table(struct kbase_device *kbdev)
- 				kbdev->devfreq_table[i].real_freqs[j] =
- 					real_freqs[j];
- 		}
--#ifdef CONFIG_REGULATOR
-+#if IS_ENABLED(CONFIG_REGULATOR)
- 		if (kbdev->nr_regulators > 0) {
- 			int j;
- 
-@@ -493,11 +518,9 @@ static int kbase_devfreq_init_core_mask_table(struct kbase_device *kbdev)
- 	kbdev->num_opps = i;
- 
- 	return 0;
--#endif /* KERNEL_VERSION(3, 18, 0) > LINUX_VERSION_CODE */
-+#endif /* CONFIG_OF */
- }
- 
--#if LINUX_VERSION_CODE >= KERNEL_VERSION(3, 8, 0)
--
- static const char *kbase_devfreq_req_type_name(enum kbase_devfreq_work_type type)
- {
- 	const char *p;
-@@ -554,27 +577,26 @@ static void kbase_devfreq_suspend_resume_worker(struct work_struct *work)
- 	}
- }
- 
--#endif /* LINUX_VERSION_CODE >= KERNEL_VERSION(3, 8, 0) */
--
- void kbase_devfreq_enqueue_work(struct kbase_device *kbdev,
- 				       enum kbase_devfreq_work_type work_type)
- {
--#if LINUX_VERSION_CODE >= KERNEL_VERSION(3, 8, 0)
- 	unsigned long flags;
- 
- 	WARN_ON(work_type == DEVFREQ_WORK_NONE);
- 	spin_lock_irqsave(&kbdev->hwaccess_lock, flags);
--	kbdev->devfreq_queue.req_type = work_type;
--	queue_work(kbdev->devfreq_queue.workq, &kbdev->devfreq_queue.work);
-+	/* Skip enqueuing a work if workqueue has already been terminated. */
-+	if (likely(kbdev->devfreq_queue.workq)) {
-+		kbdev->devfreq_queue.req_type = work_type;
-+		queue_work(kbdev->devfreq_queue.workq,
-+			   &kbdev->devfreq_queue.work);
-+	}
- 	spin_unlock_irqrestore(&kbdev->hwaccess_lock, flags);
- 	dev_dbg(kbdev->dev, "Enqueuing devfreq req: %s\n",
- 		kbase_devfreq_req_type_name(work_type));
--#endif
- }
- 
- static int kbase_devfreq_work_init(struct kbase_device *kbdev)
- {
--#if LINUX_VERSION_CODE >= KERNEL_VERSION(3, 8, 0)
- 	kbdev->devfreq_queue.req_type = DEVFREQ_WORK_NONE;
- 	kbdev->devfreq_queue.acted_type = DEVFREQ_WORK_RESUME;
- 
-@@ -584,17 +606,23 @@ static int kbase_devfreq_work_init(struct kbase_device *kbdev)
- 
- 	INIT_WORK(&kbdev->devfreq_queue.work,
- 			kbase_devfreq_suspend_resume_worker);
--#endif
- 	return 0;
- }
- 
- static void kbase_devfreq_work_term(struct kbase_device *kbdev)
- {
--#if LINUX_VERSION_CODE >= KERNEL_VERSION(3, 8, 0)
--	destroy_workqueue(kbdev->devfreq_queue.workq);
--#endif
-+	unsigned long flags;
-+	struct workqueue_struct *workq;
-+
-+	spin_lock_irqsave(&kbdev->hwaccess_lock, flags);
-+	workq = kbdev->devfreq_queue.workq;
-+	kbdev->devfreq_queue.workq = NULL;
-+	spin_unlock_irqrestore(&kbdev->hwaccess_lock, flags);
-+
-+	destroy_workqueue(workq);
- }
- 
-+
- int kbase_devfreq_init(struct kbase_device *kbdev)
- {
- 	struct devfreq_dev_profile *dp;
-@@ -631,19 +659,11 @@ int kbase_devfreq_init(struct kbase_device *kbdev)
- 		/* Record the maximum frequency possible */
- 		kbdev->gpu_props.props.core_props.gpu_freq_khz_max =
- 			dp->freq_table[0] / 1000;
--	};
--
--	err = kbase_devfreq_init_core_mask_table(kbdev);
--	if (err) {
--		kbase_devfreq_term_freq_table(kbdev);
--		return err;
- 	}
- 
--	/* Initialise devfreq suspend/resume workqueue */
--	err = kbase_devfreq_work_init(kbdev);
-+	err = kbase_devfreq_init_core_mask_table(kbdev);
- 	if (err) {
- 		kbase_devfreq_term_freq_table(kbdev);
--		dev_err(kbdev->dev, "Devfreq initialization failed");
- 		return err;
- 	}
- 
-@@ -651,13 +671,27 @@ int kbase_devfreq_init(struct kbase_device *kbdev)
- 				"simple_ondemand", NULL);
- 	if (IS_ERR(kbdev->devfreq)) {
- 		err = PTR_ERR(kbdev->devfreq);
--		kbase_devfreq_work_term(kbdev);
-+		kbdev->devfreq = NULL;
-+		kbase_devfreq_term_core_mask_table(kbdev);
- 		kbase_devfreq_term_freq_table(kbdev);
-+		dev_err(kbdev->dev, "Fail to add devfreq device(%d)\n", err);
-+		return err;
-+	}
-+
-+	/* Initialize devfreq suspend/resume workqueue */
-+	err = kbase_devfreq_work_init(kbdev);
-+	if (err) {
-+		if (devfreq_remove_device(kbdev->devfreq))
-+			dev_err(kbdev->dev, "Fail to rm devfreq\n");
-+		kbdev->devfreq = NULL;
-+		kbase_devfreq_term_core_mask_table(kbdev);
-+		dev_err(kbdev->dev, "Fail to init devfreq workqueue\n");
- 		return err;
- 	}
- 
- 	/* devfreq_add_device only copies a few of kbdev->dev's fields, so
--	 * set drvdata explicitly so IPA models can access kbdev. */
-+	 * set drvdata explicitly so IPA models can access kbdev.
-+	 */
- 	dev_set_drvdata(&kbdev->devfreq->dev, kbdev);
- 
- 	err = devfreq_register_opp_notifier(kbdev->dev, kbdev->devfreq);
-@@ -667,11 +701,11 @@ int kbase_devfreq_init(struct kbase_device *kbdev)
- 		goto opp_notifier_failed;
- 	}
- 
--#ifdef CONFIG_DEVFREQ_THERMAL
-+#if IS_ENABLED(CONFIG_DEVFREQ_THERMAL)
- 	err = kbase_ipa_init(kbdev);
- 	if (err) {
- 		dev_err(kbdev->dev, "IPA initialization failed\n");
--		goto cooling_failed;
-+		goto ipa_init_failed;
- 	}
- 
- 	kbdev->devfreq_cooling = of_devfreq_cooling_register_power(
-@@ -683,23 +717,28 @@ int kbase_devfreq_init(struct kbase_device *kbdev)
- 		dev_err(kbdev->dev,
- 			"Failed to register cooling device (%d)\n",
- 			err);
--		goto cooling_failed;
-+		goto cooling_reg_failed;
- 	}
- #endif
- 
- 	return 0;
- 
--#ifdef CONFIG_DEVFREQ_THERMAL
--cooling_failed:
-+#if IS_ENABLED(CONFIG_DEVFREQ_THERMAL)
-+cooling_reg_failed:
-+	kbase_ipa_term(kbdev);
-+ipa_init_failed:
- 	devfreq_unregister_opp_notifier(kbdev->dev, kbdev->devfreq);
- #endif /* CONFIG_DEVFREQ_THERMAL */
-+
- opp_notifier_failed:
-+	kbase_devfreq_work_term(kbdev);
-+
- 	if (devfreq_remove_device(kbdev->devfreq))
- 		dev_err(kbdev->dev, "Failed to terminate devfreq (%d)\n", err);
--	else
--		kbdev->devfreq = NULL;
- 
--	kbase_devfreq_work_term(kbdev);
-+	kbdev->devfreq = NULL;
-+
-+	kbase_devfreq_term_core_mask_table(kbdev);
- 
- 	return err;
- }
-@@ -710,7 +749,7 @@ void kbase_devfreq_term(struct kbase_device *kbdev)
- 
- 	dev_dbg(kbdev->dev, "Term Mali devfreq\n");
- 
--#ifdef CONFIG_DEVFREQ_THERMAL
-+#if IS_ENABLED(CONFIG_DEVFREQ_THERMAL)
- 	if (kbdev->devfreq_cooling)
- 		devfreq_cooling_unregister(kbdev->devfreq_cooling);
- 
-@@ -719,6 +758,8 @@ void kbase_devfreq_term(struct kbase_device *kbdev)
- 
- 	devfreq_unregister_opp_notifier(kbdev->dev, kbdev->devfreq);
- 
-+	kbase_devfreq_work_term(kbdev);
-+
- 	err = devfreq_remove_device(kbdev->devfreq);
- 	if (err)
- 		dev_err(kbdev->dev, "Failed to terminate devfreq (%d)\n", err);
-@@ -726,6 +767,4 @@ void kbase_devfreq_term(struct kbase_device *kbdev)
- 		kbdev->devfreq = NULL;
- 
- 	kbase_devfreq_term_core_mask_table(kbdev);
--
--	kbase_devfreq_work_term(kbdev);
- }
-diff --git a/dvalin/kernel/drivers/gpu/arm/midgard/backend/gpu/mali_kbase_devfreq.h b/dvalin/kernel/drivers/gpu/arm/midgard/backend/gpu/mali_kbase_devfreq.h
-index 8c976b2..901827e 100644
---- a/dvalin/kernel/drivers/gpu/arm/midgard/backend/gpu/mali_kbase_devfreq.h
-+++ b/dvalin/kernel/drivers/gpu/arm/midgard/backend/gpu/mali_kbase_devfreq.h
-@@ -1,11 +1,12 @@
-+/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
- /*
-  *
-- * (C) COPYRIGHT 2014, 2019 ARM Limited. All rights reserved.
-+ * (C) COPYRIGHT 2014, 2019-2021 ARM Limited. All rights reserved.
-  *
-  * This program is free software and is provided to you under the terms of the
-  * GNU General Public License version 2 as published by the Free Software
-  * Foundation, and any use by you of this program is subject to the terms
-- * of such GNU licence.
-+ * of such GNU license.
-  *
-  * This program is distributed in the hope that it will be useful,
-  * but WITHOUT ANY WARRANTY; without even the implied warranty of
-@@ -16,8 +17,6 @@
-  * along with this program; if not, you can access it online at
-  * http://www.gnu.org/licenses/gpl-2.0.html.
-  *
-- * SPDX-License-Identifier: GPL-2.0
-- *
-  */
- 
- #ifndef _BASE_DEVFREQ_H_
-@@ -43,4 +42,20 @@ void kbase_devfreq_force_freq(struct kbase_device *kbdev, unsigned long freq);
- void kbase_devfreq_enqueue_work(struct kbase_device *kbdev,
- 				enum kbase_devfreq_work_type work_type);
- 
-+/**
-+ * kbase_devfreq_opp_translate - Translate nominal OPP frequency from devicetree
-+ *                               into real frequency & voltage pair, along with
-+ *                               core mask
-+ * @kbdev:     Device pointer
-+ * @freq:      Nominal frequency
-+ * @core_mask: Pointer to u64 to store core mask to
-+ * @freqs:     Pointer to array of frequencies
-+ * @volts:     Pointer to array of voltages
-+ *
-+ * This function will only perform translation if an operating-points-v2-mali
-+ * table is present in devicetree. If one is not present then it will return an
-+ * untranslated frequency (and corresponding voltage) and all cores enabled.
-+ */
-+void kbase_devfreq_opp_translate(struct kbase_device *kbdev, unsigned long freq,
-+	u64 *core_mask, unsigned long *freqs, unsigned long *volts);
- #endif /* _BASE_DEVFREQ_H_ */
-diff --git a/dvalin/kernel/drivers/gpu/arm/midgard/backend/gpu/mali_kbase_device_hw.c b/dvalin/kernel/drivers/gpu/arm/midgard/backend/gpu/mali_kbase_device_hw.c
-deleted file mode 100755
-index 5943e4e..0000000
---- a/dvalin/kernel/drivers/gpu/arm/midgard/backend/gpu/mali_kbase_device_hw.c
-+++ /dev/null
-@@ -1,388 +0,0 @@
--/*
-- *
-- * (C) COPYRIGHT 2014-2016, 2018-2020 ARM Limited. All rights reserved.
-- *
-- * This program is free software and is provided to you under the terms of the
-- * GNU General Public License version 2 as published by the Free Software
-- * Foundation, and any use by you of this program is subject to the terms
-- * of such GNU licence.
-- *
-- * This program is distributed in the hope that it will be useful,
-- * but WITHOUT ANY WARRANTY; without even the implied warranty of
-- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-- * GNU General Public License for more details.
-- *
-- * You should have received a copy of the GNU General Public License
-- * along with this program; if not, you can access it online at
-- * http://www.gnu.org/licenses/gpl-2.0.html.
-- *
-- * SPDX-License-Identifier: GPL-2.0
-- *
-- */
--
--
--/*
-- *
-- */
--#include <mali_kbase.h>
--#include <gpu/mali_kbase_gpu_fault.h>
--#include <backend/gpu/mali_kbase_instr_internal.h>
--#include <backend/gpu/mali_kbase_pm_internal.h>
--#include <backend/gpu/mali_kbase_device_internal.h>
--#include <mali_kbase_reset_gpu.h>
--#include <mmu/mali_kbase_mmu.h>
--
--#if !defined(CONFIG_MALI_NO_MALI)
--
--#ifdef CONFIG_DEBUG_FS
--
--int kbase_io_history_resize(struct kbase_io_history *h, u16 new_size)
--{
--	struct kbase_io_access *old_buf;
--	struct kbase_io_access *new_buf;
--	unsigned long flags;
--
--	if (!new_size)
--		goto out_err; /* The new size must not be 0 */
--
--	new_buf = vmalloc(new_size * sizeof(*h->buf));
--	if (!new_buf)
--		goto out_err;
--
--	spin_lock_irqsave(&h->lock, flags);
--
--	old_buf = h->buf;
--
--	/* Note: we won't bother with copying the old data over. The dumping
--	 * logic wouldn't work properly as it relies on 'count' both as a
--	 * counter and as an index to the buffer which would have changed with
--	 * the new array. This is a corner case that we don't need to support.
--	 */
--	h->count = 0;
--	h->size = new_size;
--	h->buf = new_buf;
--
--	spin_unlock_irqrestore(&h->lock, flags);
--
--	vfree(old_buf);
--
--	return 0;
--
--out_err:
--	return -1;
--}
--
--
--int kbase_io_history_init(struct kbase_io_history *h, u16 n)
--{
--	h->enabled = false;
--	spin_lock_init(&h->lock);
--	h->count = 0;
--	h->size = 0;
--	h->buf = NULL;
--	if (kbase_io_history_resize(h, n))
--		return -1;
--
--	return 0;
--}
--
--
--void kbase_io_history_term(struct kbase_io_history *h)
--{
--	vfree(h->buf);
--	h->buf = NULL;
--}
--
--
--/* kbase_io_history_add - add new entry to the register access history
-- *
-- * @h: Pointer to the history data structure
-- * @addr: Register address
-- * @value: The value that is either read from or written to the register
-- * @write: 1 if it's a register write, 0 if it's a read
-- */
--static void kbase_io_history_add(struct kbase_io_history *h,
--		void __iomem const *addr, u32 value, u8 write)
--{
--	struct kbase_io_access *io;
--	unsigned long flags;
--
--	spin_lock_irqsave(&h->lock, flags);
--
--	io = &h->buf[h->count % h->size];
--	io->addr = (uintptr_t)addr | write;
--	io->value = value;
--	++h->count;
--	/* If count overflows, move the index by the buffer size so the entire
--	 * buffer will still be dumped later */
--	if (unlikely(!h->count))
--		h->count = h->size;
--
--	spin_unlock_irqrestore(&h->lock, flags);
--}
--
--
--void kbase_io_history_dump(struct kbase_device *kbdev)
--{
--	struct kbase_io_history *const h = &kbdev->io_history;
--	u16 i;
--	size_t iters;
--	unsigned long flags;
--
--	if (!unlikely(h->enabled))
--		return;
--
--	spin_lock_irqsave(&h->lock, flags);
--
--	dev_err(kbdev->dev, "Register IO History:");
--	iters = (h->size > h->count) ? h->count : h->size;
--	dev_err(kbdev->dev, "Last %zu register accesses of %zu total:\n", iters,
--			h->count);
--	for (i = 0; i < iters; ++i) {
--		struct kbase_io_access *io =
--			&h->buf[(h->count - iters + i) % h->size];
--		char const access = (io->addr & 1) ? 'w' : 'r';
--
--		dev_err(kbdev->dev, "%6i: %c: reg 0x%016lx val %08x\n", i,
--			access, (unsigned long)(io->addr & ~0x1), io->value);
--	}
--
--	spin_unlock_irqrestore(&h->lock, flags);
--}
--
--
--#endif /* CONFIG_DEBUG_FS */
--
--
--void kbase_reg_write(struct kbase_device *kbdev, u32 offset, u32 value)
--{
--	KBASE_DEBUG_ASSERT(kbdev->pm.backend.gpu_powered);
--	KBASE_DEBUG_ASSERT(kbdev->dev != NULL);
--
--	writel(value, kbdev->reg + offset);
--
--#ifdef CONFIG_DEBUG_FS
--	if (unlikely(kbdev->io_history.enabled))
--		kbase_io_history_add(&kbdev->io_history, kbdev->reg + offset,
--				value, 1);
--#endif /* CONFIG_DEBUG_FS */
--	dev_dbg(kbdev->dev, "w: reg %08x val %08x", offset, value);
--}
--
--KBASE_EXPORT_TEST_API(kbase_reg_write);
--
--u32 kbase_reg_read(struct kbase_device *kbdev, u32 offset)
--{
--	u32 val;
--	KBASE_DEBUG_ASSERT(kbdev->pm.backend.gpu_powered);
--	KBASE_DEBUG_ASSERT(kbdev->dev != NULL);
--
--	val = readl(kbdev->reg + offset);
--
--#ifdef CONFIG_DEBUG_FS
--	if (unlikely(kbdev->io_history.enabled))
--		kbase_io_history_add(&kbdev->io_history, kbdev->reg + offset,
--				val, 0);
--#endif /* CONFIG_DEBUG_FS */
--	dev_dbg(kbdev->dev, "r: reg %08x val %08x", offset, val);
--
--	return val;
--}
--
--KBASE_EXPORT_TEST_API(kbase_reg_read);
--
--bool kbase_is_gpu_lost(struct kbase_device *kbdev)
--{
--	u32 val;
--
--	val = kbase_reg_read(kbdev, GPU_CONTROL_REG(GPU_ID));
--
--	return val == 0;
--}
--#endif /* !defined(CONFIG_MALI_NO_MALI) */
--
--/**
-- * kbase_report_gpu_fault - Report a GPU fault.
-- * @kbdev:    Kbase device pointer
-- * @multiple: Zero if only GPU_FAULT was raised, non-zero if MULTIPLE_GPU_FAULTS
-- *            was also set
-- *
-- * This function is called from the interrupt handler when a GPU fault occurs.
-- * It reports the details of the fault using dev_warn().
-- */
--static void kbase_report_gpu_fault(struct kbase_device *kbdev, int multiple)
--{
--	u32 status = kbase_reg_read(kbdev, GPU_CONTROL_REG(GPU_FAULTSTATUS));
--	u64 address = (u64) kbase_reg_read(kbdev,
--			GPU_CONTROL_REG(GPU_FAULTADDRESS_HI)) << 32;
--
--	address |= kbase_reg_read(kbdev,
--			GPU_CONTROL_REG(GPU_FAULTADDRESS_LO));
--
--	meson_gpu_fault ++;
--	dev_warn(kbdev->dev, "GPU Fault 0x%08x (%s) at 0x%016llx",
--		status,
--		kbase_gpu_exception_name(status & 0xFF),
--		address);
--	if (multiple)
--		dev_warn(kbdev->dev, "There were multiple GPU faults - some have not been reported\n");
--}
--
--static bool kbase_gpu_fault_interrupt(struct kbase_device *kbdev, int multiple)
--{
--	kbase_report_gpu_fault(kbdev, multiple);
--	return false;
--}
--
--void kbase_gpu_start_cache_clean_nolock(struct kbase_device *kbdev)
--{
--	u32 irq_mask;
--
--	lockdep_assert_held(&kbdev->hwaccess_lock);
--
--	if (kbdev->cache_clean_in_progress) {
--		/* If this is called while another clean is in progress, we
--		 * can't rely on the current one to flush any new changes in
--		 * the cache. Instead, trigger another cache clean immediately
--		 * after this one finishes.
--		 */
--		kbdev->cache_clean_queued = true;
--		return;
--	}
--
--	/* Enable interrupt */
--	irq_mask = kbase_reg_read(kbdev, GPU_CONTROL_REG(GPU_IRQ_MASK));
--	kbase_reg_write(kbdev, GPU_CONTROL_REG(GPU_IRQ_MASK),
--				irq_mask | CLEAN_CACHES_COMPLETED);
--
--	KBASE_KTRACE_ADD(kbdev, CORE_GPU_CLEAN_INV_CACHES, NULL, 0);
--	kbase_reg_write(kbdev, GPU_CONTROL_REG(GPU_COMMAND),
--					GPU_COMMAND_CLEAN_INV_CACHES);
--
--	kbdev->cache_clean_in_progress = true;
--}
--
--void kbase_gpu_start_cache_clean(struct kbase_device *kbdev)
--{
--	unsigned long flags;
--
--	spin_lock_irqsave(&kbdev->hwaccess_lock, flags);
--	kbase_gpu_start_cache_clean_nolock(kbdev);
--	spin_unlock_irqrestore(&kbdev->hwaccess_lock, flags);
--}
--
--void kbase_gpu_cache_clean_wait_complete(struct kbase_device *kbdev)
--{
--	lockdep_assert_held(&kbdev->hwaccess_lock);
--
--	kbdev->cache_clean_queued = false;
--	kbdev->cache_clean_in_progress = false;
--	wake_up(&kbdev->cache_clean_wait);
--}
--
--static void kbase_clean_caches_done(struct kbase_device *kbdev)
--{
--	u32 irq_mask;
--	unsigned long flags;
--
--	spin_lock_irqsave(&kbdev->hwaccess_lock, flags);
--
--	if (kbdev->cache_clean_queued) {
--		kbdev->cache_clean_queued = false;
--
--		KBASE_KTRACE_ADD(kbdev, CORE_GPU_CLEAN_INV_CACHES, NULL, 0);
--		kbase_reg_write(kbdev, GPU_CONTROL_REG(GPU_COMMAND),
--				GPU_COMMAND_CLEAN_INV_CACHES);
--	} else {
--		/* Disable interrupt */
--		irq_mask = kbase_reg_read(kbdev, GPU_CONTROL_REG(GPU_IRQ_MASK));
--		kbase_reg_write(kbdev, GPU_CONTROL_REG(GPU_IRQ_MASK),
--				irq_mask & ~CLEAN_CACHES_COMPLETED);
--
--		kbase_gpu_cache_clean_wait_complete(kbdev);
--	}
--
--	spin_unlock_irqrestore(&kbdev->hwaccess_lock, flags);
--}
--
--static inline bool get_cache_clean_flag(struct kbase_device *kbdev)
--{
--	bool cache_clean_in_progress;
--	unsigned long flags;
--
--	spin_lock_irqsave(&kbdev->hwaccess_lock, flags);
--	cache_clean_in_progress = kbdev->cache_clean_in_progress;
--	spin_unlock_irqrestore(&kbdev->hwaccess_lock, flags);
--
--	return cache_clean_in_progress;
--}
--
--void kbase_gpu_wait_cache_clean(struct kbase_device *kbdev)
--{
--	while (get_cache_clean_flag(kbdev)) {
--		wait_event_interruptible(kbdev->cache_clean_wait,
--				!kbdev->cache_clean_in_progress);
--	}
--}
--
--int kbase_gpu_wait_cache_clean_timeout(struct kbase_device *kbdev,
--				unsigned int wait_timeout_ms)
--{
--	long remaining = msecs_to_jiffies(wait_timeout_ms);
--
--	while (remaining && get_cache_clean_flag(kbdev)) {
--		remaining = wait_event_timeout(kbdev->cache_clean_wait,
--					!kbdev->cache_clean_in_progress,
--					remaining);
--	}
--
--	return (remaining ? 0 : -ETIMEDOUT);
--}
--
--void kbase_gpu_interrupt(struct kbase_device *kbdev, u32 val)
--{
--	bool clear_gpu_fault = false;
--
--	KBASE_KTRACE_ADD(kbdev, CORE_GPU_IRQ, NULL, val);
--	if (val & GPU_FAULT)
--		clear_gpu_fault = kbase_gpu_fault_interrupt(kbdev,
--					val & MULTIPLE_GPU_FAULTS);
--
--	if (val & RESET_COMPLETED)
--		kbase_pm_reset_done(kbdev);
--
--	if (val & PRFCNT_SAMPLE_COMPLETED)
--		kbase_instr_hwcnt_sample_done(kbdev);
--
--	KBASE_KTRACE_ADD(kbdev, CORE_GPU_IRQ_CLEAR, NULL, val);
--	kbase_reg_write(kbdev, GPU_CONTROL_REG(GPU_IRQ_CLEAR), val);
--
--	/* kbase_pm_check_transitions (called by kbase_pm_power_changed) must
--	 * be called after the IRQ has been cleared. This is because it might
--	 * trigger further power transitions and we don't want to miss the
--	 * interrupt raised to notify us that these further transitions have
--	 * finished. The same applies to kbase_clean_caches_done() - if another
--	 * clean was queued, it might trigger another clean, which might
--	 * generate another interrupt which shouldn't be missed.
--	 */
--
--	if (val & CLEAN_CACHES_COMPLETED)
--		kbase_clean_caches_done(kbdev);
--
--	if (val & POWER_CHANGED_ALL) {
--		kbase_pm_power_changed(kbdev);
--	} else if (val & CLEAN_CACHES_COMPLETED) {
--		/* If cache line evict messages can be lost when shader cores
--		 * power down then we need to flush the L2 cache before powering
--		 * down cores. When the flush completes, the shaders' state
--		 * machine needs to be re-invoked to proceed with powering down
--		 * cores.
--		 */
--		if (kbdev->pm.backend.l2_always_on ||
--				kbase_hw_has_issue(kbdev, BASE_HW_ISSUE_TTRX_921))
--			kbase_pm_power_changed(kbdev);
--	}
--
--
--	KBASE_KTRACE_ADD(kbdev, CORE_GPU_IRQ_DONE, NULL, val);
--}
-diff --git a/dvalin/kernel/drivers/gpu/arm/midgard/backend/gpu/mali_kbase_device_internal.h b/dvalin/kernel/drivers/gpu/arm/midgard/backend/gpu/mali_kbase_device_internal.h
-deleted file mode 100644
-index 2e1d011..0000000
---- a/dvalin/kernel/drivers/gpu/arm/midgard/backend/gpu/mali_kbase_device_internal.h
-+++ /dev/null
-@@ -1,127 +0,0 @@
--/*
-- *
-- * (C) COPYRIGHT 2014,2019-2020 ARM Limited. All rights reserved.
-- *
-- * This program is free software and is provided to you under the terms of the
-- * GNU General Public License version 2 as published by the Free Software
-- * Foundation, and any use by you of this program is subject to the terms
-- * of such GNU licence.
-- *
-- * This program is distributed in the hope that it will be useful,
-- * but WITHOUT ANY WARRANTY; without even the implied warranty of
-- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-- * GNU General Public License for more details.
-- *
-- * You should have received a copy of the GNU General Public License
-- * along with this program; if not, you can access it online at
-- * http://www.gnu.org/licenses/gpl-2.0.html.
-- *
-- * SPDX-License-Identifier: GPL-2.0
-- *
-- */
--
--
--
--/*
-- * Backend-specific HW access device APIs
-- */
--
--#ifndef _KBASE_DEVICE_INTERNAL_H_
--#define _KBASE_DEVICE_INTERNAL_H_
--
--/**
-- * kbase_reg_write - write to GPU register
-- * @kbdev:  Kbase device pointer
-- * @offset: Offset of register
-- * @value:  Value to write
-- *
-- * Caller must ensure the GPU is powered (@kbdev->pm.gpu_powered != false).
-- */
--void kbase_reg_write(struct kbase_device *kbdev, u32 offset, u32 value);
--
--/**
-- * kbase_reg_read - read from GPU register
-- * @kbdev:  Kbase device pointer
-- * @offset: Offset of register
-- *
-- * Caller must ensure the GPU is powered (@kbdev->pm.gpu_powered != false).
-- *
-- * Return: Value in desired register
-- */
--u32 kbase_reg_read(struct kbase_device *kbdev, u32 offset);
--
--/**
-- * kbase_is_gpu_lost() - Has the GPU been lost.
-- * @kbdev:    Kbase device pointer
-- *
-- * This function will return true if the GPU has been lost.
-- * When this happens register reads will be zero. A zero GPU_ID is
-- * invalid so this is used to detect GPU_LOST
-- *
-- * Return: True if GPU LOST
-- */
--bool kbase_is_gpu_lost(struct kbase_device *kbdev);
--
--/**
-- * kbase_gpu_start_cache_clean - Start a cache clean
-- * @kbdev: Kbase device
-- *
-- * Issue a cache clean and invalidate command to hardware. This function will
-- * take hwaccess_lock.
-- */
--void kbase_gpu_start_cache_clean(struct kbase_device *kbdev);
--
--/**
-- * kbase_gpu_start_cache_clean_nolock - Start a cache clean
-- * @kbdev: Kbase device
-- *
-- * Issue a cache clean and invalidate command to hardware. hwaccess_lock
-- * must be held by the caller.
-- */
--void kbase_gpu_start_cache_clean_nolock(struct kbase_device *kbdev);
--
--/**
-- * kbase_gpu_wait_cache_clean - Wait for cache cleaning to finish
-- * @kbdev: Kbase device
-- *
-- * This function will take hwaccess_lock, and may sleep.
-- */
--void kbase_gpu_wait_cache_clean(struct kbase_device *kbdev);
--
--/**
-- * kbase_gpu_wait_cache_clean_timeout - Wait for certain time for cache
-- *                                      cleaning to finish
-- * @kbdev: Kbase device
-- * @wait_timeout_ms: Time, in milli seconds, to wait for cache clean to complete.
-- *
-- * This function will take hwaccess_lock, and may sleep. This is supposed to be
-- * called from paths (like GPU reset) where an indefinite wait for the completion
-- * of cache clean operation can cause deadlock, as the operation may never
-- * complete.
-- *
-- * Return: 0 if successful or a negative error code on failure.
-- */
--int kbase_gpu_wait_cache_clean_timeout(struct kbase_device *kbdev,
--		unsigned int wait_timeout_ms);
--
--/**
-- * kbase_gpu_cache_clean_wait_complete - Called after the cache cleaning is
-- *                                       finished. Would also be called after
-- *                                       the GPU reset.
-- * @kbdev: Kbase device
-- *
-- * Caller must hold the hwaccess_lock.
-- */
--void kbase_gpu_cache_clean_wait_complete(struct kbase_device *kbdev);
--
--/**
-- * kbase_gpu_interrupt - GPU interrupt handler
-- * @kbdev: Kbase device pointer
-- * @val:   The value of the GPU IRQ status register which triggered the call
-- *
-- * This function is called from the interrupt handler when a GPU irq is to be
-- * handled.
-- */
--void kbase_gpu_interrupt(struct kbase_device *kbdev, u32 val);
--
--#endif /* _KBASE_DEVICE_INTERNAL_H_ */
-diff --git a/dvalin/kernel/drivers/gpu/arm/midgard/backend/gpu/mali_kbase_gpuprops_backend.c b/dvalin/kernel/drivers/gpu/arm/midgard/backend/gpu/mali_kbase_gpuprops_backend.c
-index 352afa1..11088db 100644
---- a/dvalin/kernel/drivers/gpu/arm/midgard/backend/gpu/mali_kbase_gpuprops_backend.c
-+++ b/dvalin/kernel/drivers/gpu/arm/midgard/backend/gpu/mali_kbase_gpuprops_backend.c
-@@ -1,12 +1,12 @@
--// SPDX-License-Identifier: GPL-2.0
-+// SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note
- /*
-  *
-- * (C) COPYRIGHT 2014-2020 ARM Limited. All rights reserved.
-+ * (C) COPYRIGHT 2014-2021 ARM Limited. All rights reserved.
-  *
-  * This program is free software and is provided to you under the terms of the
-  * GNU General Public License version 2 as published by the Free Software
-  * Foundation, and any use by you of this program is subject to the terms
-- * of such GNU licence.
-+ * of such GNU license.
-  *
-  * This program is distributed in the hope that it will be useful,
-  * but WITHOUT ANY WARRANTY; without even the implied warranty of
-@@ -17,8 +17,6 @@
-  * along with this program; if not, you can access it online at
-  * http://www.gnu.org/licenses/gpl-2.0.html.
-  *
-- * SPDX-License-Identifier: GPL-2.0
-- *
-  */
- 
- /*
-@@ -26,7 +24,7 @@
-  */
- 
- #include <mali_kbase.h>
--#include <backend/gpu/mali_kbase_device_internal.h>
-+#include <device/mali_kbase_device.h>
- #include <backend/gpu/mali_kbase_pm_internal.h>
- #include <mali_kbase_hwaccess_gpuprops.h>
- 
-@@ -41,8 +39,19 @@ int kbase_backend_gpuprops_get(struct kbase_device *kbdev,
- 
- 	registers.l2_features = kbase_reg_read(kbdev,
- 				GPU_CONTROL_REG(L2_FEATURES));
-+	registers.core_features = 0;
-+#if !MALI_USE_CSF
-+	/* TGOx */
- 	registers.core_features = kbase_reg_read(kbdev,
- 				GPU_CONTROL_REG(CORE_FEATURES));
-+#else /* !MALI_USE_CSF */
-+	if (((registers.gpu_id & GPU_ID2_PRODUCT_MODEL) ==
-+	     GPU_ID2_PRODUCT_TGRX) ||
-+	    ((registers.gpu_id & GPU_ID2_PRODUCT_MODEL) ==
-+	     GPU_ID2_PRODUCT_TVAX))
-+		registers.core_features =
-+			kbase_reg_read(kbdev, GPU_CONTROL_REG(CORE_FEATURES));
-+#endif /* MALI_USE_CSF */
- 	registers.tiler_features = kbase_reg_read(kbdev,
- 				GPU_CONTROL_REG(TILER_FEATURES));
- 	registers.mem_features = kbase_reg_read(kbdev,
-@@ -51,12 +60,20 @@ int kbase_backend_gpuprops_get(struct kbase_device *kbdev,
- 				GPU_CONTROL_REG(MMU_FEATURES));
- 	registers.as_present = kbase_reg_read(kbdev,
- 				GPU_CONTROL_REG(AS_PRESENT));
-+#if !MALI_USE_CSF
- 	registers.js_present = kbase_reg_read(kbdev,
- 				GPU_CONTROL_REG(JS_PRESENT));
-+#else /* !MALI_USE_CSF */
-+	registers.js_present = 0;
-+#endif /* !MALI_USE_CSF */
- 
- 	for (i = 0; i < GPU_MAX_JOB_SLOTS; i++)
-+#if !MALI_USE_CSF
- 		registers.js_features[i] = kbase_reg_read(kbdev,
- 				GPU_CONTROL_REG(JS_FEATURES_REG(i)));
-+#else /* !MALI_USE_CSF */
-+		registers.js_features[i] = 0;
-+#endif /* !MALI_USE_CSF */
- 
- 	for (i = 0; i < BASE_GPU_NUM_TEXTURE_FEATURES_REGISTERS; i++)
- 		registers.texture_features[i] = kbase_reg_read(kbdev,
-@@ -93,13 +110,49 @@ int kbase_backend_gpuprops_get(struct kbase_device *kbdev,
- 	registers.stack_present_hi = kbase_reg_read(kbdev,
- 				GPU_CONTROL_REG(STACK_PRESENT_HI));
- 
--	if (!kbase_is_gpu_lost(kbdev)) {
-+	if (registers.gpu_id >= GPU_ID2_PRODUCT_MAKE(11, 8, 5, 2)) {
-+		registers.gpu_features_lo = kbase_reg_read(kbdev,
-+					GPU_CONTROL_REG(GPU_FEATURES_LO));
-+		registers.gpu_features_hi = kbase_reg_read(kbdev,
-+					GPU_CONTROL_REG(GPU_FEATURES_HI));
-+	} else {
-+		registers.gpu_features_lo = 0;
-+		registers.gpu_features_hi = 0;
-+	}
-+
-+	if (!kbase_is_gpu_removed(kbdev)) {
- 		*regdump = registers;
- 		return 0;
- 	} else
- 		return -EIO;
- }
- 
-+int kbase_backend_gpuprops_get_curr_config(struct kbase_device *kbdev,
-+		struct kbase_current_config_regdump *curr_config_regdump)
-+{
-+	if (WARN_ON(!kbdev) || WARN_ON(!curr_config_regdump))
-+		return -EINVAL;
-+
-+	curr_config_regdump->mem_features = kbase_reg_read(kbdev,
-+					GPU_CONTROL_REG(MEM_FEATURES));
-+
-+	curr_config_regdump->shader_present_lo = kbase_reg_read(kbdev,
-+					GPU_CONTROL_REG(SHADER_PRESENT_LO));
-+	curr_config_regdump->shader_present_hi = kbase_reg_read(kbdev,
-+					GPU_CONTROL_REG(SHADER_PRESENT_HI));
-+
-+	curr_config_regdump->l2_present_lo = kbase_reg_read(kbdev,
-+					GPU_CONTROL_REG(L2_PRESENT_LO));
-+	curr_config_regdump->l2_present_hi = kbase_reg_read(kbdev,
-+					GPU_CONTROL_REG(L2_PRESENT_HI));
-+
-+	if (WARN_ON(kbase_is_gpu_removed(kbdev)))
-+		return -EIO;
-+
-+	return 0;
-+
-+}
-+
- int kbase_backend_gpuprops_get_features(struct kbase_device *kbdev,
- 					struct kbase_gpuprops_regdump *regdump)
- {
-@@ -112,7 +165,7 @@ int kbase_backend_gpuprops_get_features(struct kbase_device *kbdev,
- 		coherency_features = kbase_reg_read(kbdev,
- 				GPU_CONTROL_REG(COHERENCY_FEATURES));
- 
--		if (kbase_is_gpu_lost(kbdev))
-+		if (kbase_is_gpu_removed(kbdev))
- 			return -EIO;
- 
- 		regdump->coherency_features = coherency_features;
-@@ -135,11 +188,15 @@ int kbase_backend_gpuprops_get_l2_features(struct kbase_device *kbdev,
- 	if (kbase_hw_has_feature(kbdev, BASE_HW_FEATURE_L2_CONFIG)) {
- 		u32 l2_features = kbase_reg_read(kbdev,
- 				GPU_CONTROL_REG(L2_FEATURES));
-+		u32 l2_config =
-+			kbase_reg_read(kbdev, GPU_CONTROL_REG(L2_CONFIG));
-+
- 
--		if (kbase_is_gpu_lost(kbdev))
-+		if (kbase_is_gpu_removed(kbdev))
- 			return -EIO;
- 
- 		regdump->l2_features = l2_features;
-+		regdump->l2_config = l2_config;
- 	}
- 
- 	return 0;
-diff --git a/dvalin/kernel/drivers/gpu/arm/midgard/backend/gpu/mali_kbase_instr_backend.c b/dvalin/kernel/drivers/gpu/arm/midgard/backend/gpu/mali_kbase_instr_backend.c
-index 8b320c7..d7edf30 100644
---- a/dvalin/kernel/drivers/gpu/arm/midgard/backend/gpu/mali_kbase_instr_backend.c
-+++ b/dvalin/kernel/drivers/gpu/arm/midgard/backend/gpu/mali_kbase_instr_backend.c
-@@ -1,11 +1,12 @@
-+// SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note
- /*
-  *
-- * (C) COPYRIGHT 2014-2020 ARM Limited. All rights reserved.
-+ * (C) COPYRIGHT 2014-2021 ARM Limited. All rights reserved.
-  *
-  * This program is free software and is provided to you under the terms of the
-  * GNU General Public License version 2 as published by the Free Software
-  * Foundation, and any use by you of this program is subject to the terms
-- * of such GNU licence.
-+ * of such GNU license.
-  *
-  * This program is distributed in the hope that it will be useful,
-  * but WITHOUT ANY WARRANTY; without even the implied warranty of
-@@ -16,12 +17,8 @@
-  * along with this program; if not, you can access it online at
-  * http://www.gnu.org/licenses/gpl-2.0.html.
-  *
-- * SPDX-License-Identifier: GPL-2.0
-- *
-  */
- 
--
--
- /*
-  * GPU backend instrumentation APIs.
-  */
-@@ -29,7 +26,7 @@
- #include <mali_kbase.h>
- #include <gpu/mali_kbase_gpu_regmap.h>
- #include <mali_kbase_hwaccess_instr.h>
--#include <backend/gpu/mali_kbase_device_internal.h>
-+#include <device/mali_kbase_device.h>
- #include <backend/gpu/mali_kbase_instr_internal.h>
- 
- 
-@@ -71,12 +68,12 @@ int kbase_instr_hwcnt_enable_internal(struct kbase_device *kbdev,
- 
- 	/* Configure */
- 	prfcnt_config = kctx->as_nr << PRFCNT_CONFIG_AS_SHIFT;
--#ifdef CONFIG_MALI_PRFCNT_SET_SECONDARY_VIA_DEBUG_FS
--	if (kbdev->hwcnt.backend.use_secondary_override)
-+#ifdef CONFIG_MALI_PRFCNT_SET_SELECT_VIA_DEBUG_FS
-+	prfcnt_config |= kbdev->hwcnt.backend.override_counter_set
-+			 << PRFCNT_CONFIG_SETSELECT_SHIFT;
- #else
--	if (enable->use_secondary)
-+	prfcnt_config |= enable->counter_set << PRFCNT_CONFIG_SETSELECT_SHIFT;
- #endif
--		prfcnt_config |= 1 << PRFCNT_CONFIG_SETSELECT_SHIFT;
- 
- 	kbase_reg_write(kbdev, GPU_CONTROL_REG(PRFCNT_CONFIG),
- 			prfcnt_config | PRFCNT_CONFIG_MODE_OFF);
-@@ -87,7 +84,7 @@ int kbase_instr_hwcnt_enable_internal(struct kbase_device *kbdev,
- 					enable->dump_buffer >> 32);
- 
- 	kbase_reg_write(kbdev, GPU_CONTROL_REG(PRFCNT_JM_EN),
--					enable->jm_bm);
-+					enable->fe_bm);
- 
- 	kbase_reg_write(kbdev, GPU_CONTROL_REG(PRFCNT_SHADER_EN),
- 					enable->shader_bm);
-@@ -110,7 +107,7 @@ int kbase_instr_hwcnt_enable_internal(struct kbase_device *kbdev,
- 
- 	err = 0;
- 
--	dev_dbg(kbdev->dev, "HW counters dumping set-up for context %p", kctx);
-+	dev_dbg(kbdev->dev, "HW counters dumping set-up for context %pK", kctx);
- 	return err;
-  out_err:
- 	return err;
-@@ -170,11 +167,10 @@ int kbase_instr_hwcnt_disable_internal(struct kbase_context *kctx)
- 	spin_unlock_irqrestore(&kbdev->hwcnt.lock, flags);
- 	spin_unlock_irqrestore(&kbdev->hwaccess_lock, pm_flags);
- 
--	dev_dbg(kbdev->dev, "HW counters dumping disabled for context %p",
-+	dev_dbg(kbdev->dev, "HW counters dumping disabled for context %pK",
- 									kctx);
- 
- 	err = 0;
--
-  out:
- 	return err;
- }
-@@ -194,7 +190,8 @@ int kbase_instr_hwcnt_request_dump(struct kbase_context *kctx)
- 
- 	if (kbdev->hwcnt.backend.state != KBASE_INSTR_STATE_IDLE) {
- 		/* HW counters are disabled or another dump is ongoing, or we're
--		 * resetting */
-+		 * resetting
-+		 */
- 		goto unlock;
- 	}
- 
-@@ -204,7 +201,6 @@ int kbase_instr_hwcnt_request_dump(struct kbase_context *kctx)
- 	 */
- 	kbdev->hwcnt.backend.state = KBASE_INSTR_STATE_DUMPING;
- 
--
- 	/* Reconfigure the dump address */
- 	kbase_reg_write(kbdev, GPU_CONTROL_REG(PRFCNT_BASE_LO),
- 					kbdev->hwcnt.addr & 0xFFFFFFFF);
-@@ -218,14 +214,13 @@ int kbase_instr_hwcnt_request_dump(struct kbase_context *kctx)
- 	kbase_reg_write(kbdev, GPU_CONTROL_REG(GPU_COMMAND),
- 					GPU_COMMAND_PRFCNT_SAMPLE);
- 
--	dev_dbg(kbdev->dev, "HW counters dumping done for context %p", kctx);
-+	dev_dbg(kbdev->dev, "HW counters dumping done for context %pK", kctx);
- 
- 	err = 0;
- 
-  unlock:
- 	spin_unlock_irqrestore(&kbdev->hwcnt.lock, flags);
- 
--
- 	return err;
- }
- KBASE_EXPORT_SYMBOL(kbase_instr_hwcnt_request_dump);
-@@ -254,40 +249,6 @@ bool kbase_instr_hwcnt_dump_complete(struct kbase_context *kctx,
- }
- KBASE_EXPORT_SYMBOL(kbase_instr_hwcnt_dump_complete);
- 
--void kbasep_cache_clean_worker(struct work_struct *data)
--{
--	struct kbase_device *kbdev;
--	unsigned long flags, pm_flags;
--
--	kbdev = container_of(data, struct kbase_device,
--						hwcnt.backend.cache_clean_work);
--
--	spin_lock_irqsave(&kbdev->hwaccess_lock, pm_flags);
--	spin_lock_irqsave(&kbdev->hwcnt.lock, flags);
--
--	/* Clean and invalidate the caches so we're sure the mmu tables for the
--	 * dump buffer is valid.
--	 */
--	KBASE_DEBUG_ASSERT(kbdev->hwcnt.backend.state ==
--					KBASE_INSTR_STATE_REQUEST_CLEAN);
--	kbase_gpu_start_cache_clean_nolock(kbdev);
--	spin_unlock_irqrestore(&kbdev->hwcnt.lock, flags);
--	spin_unlock_irqrestore(&kbdev->hwaccess_lock, pm_flags);
--
--	kbase_gpu_wait_cache_clean(kbdev);
--
--	spin_lock_irqsave(&kbdev->hwcnt.lock, flags);
--	KBASE_DEBUG_ASSERT(kbdev->hwcnt.backend.state ==
--					KBASE_INSTR_STATE_REQUEST_CLEAN);
--	/* All finished and idle */
--	kbdev->hwcnt.backend.state = KBASE_INSTR_STATE_IDLE;
--	kbdev->hwcnt.backend.triggered = 1;
--	wake_up(&kbdev->hwcnt.backend.wait);
--
--	spin_unlock_irqrestore(&kbdev->hwcnt.lock, flags);
--}
--
--
- void kbase_instr_hwcnt_sample_done(struct kbase_device *kbdev)
- {
- 	unsigned long flags;
-@@ -298,20 +259,10 @@ void kbase_instr_hwcnt_sample_done(struct kbase_device *kbdev)
- 		kbdev->hwcnt.backend.triggered = 1;
- 		wake_up(&kbdev->hwcnt.backend.wait);
- 	} else if (kbdev->hwcnt.backend.state == KBASE_INSTR_STATE_DUMPING) {
--		if (kbdev->mmu_mode->flags & KBASE_MMU_MODE_HAS_NON_CACHEABLE) {
--			/* All finished and idle */
--			kbdev->hwcnt.backend.state = KBASE_INSTR_STATE_IDLE;
--			kbdev->hwcnt.backend.triggered = 1;
--			wake_up(&kbdev->hwcnt.backend.wait);
--		} else {
--			int ret;
--			/* Always clean and invalidate the cache after a successful dump
--			 */
--			kbdev->hwcnt.backend.state = KBASE_INSTR_STATE_REQUEST_CLEAN;
--			ret = queue_work(kbdev->hwcnt.backend.cache_clean_wq,
--						&kbdev->hwcnt.backend.cache_clean_work);
--			KBASE_DEBUG_ASSERT(ret);
--		}
-+		/* All finished and idle */
-+		kbdev->hwcnt.backend.state = KBASE_INSTR_STATE_IDLE;
-+		kbdev->hwcnt.backend.triggered = 1;
-+		wake_up(&kbdev->hwcnt.backend.wait);
- 	}
- 
- 	spin_unlock_irqrestore(&kbdev->hwcnt.lock, flags);
-@@ -353,7 +304,8 @@ int kbase_instr_hwcnt_clear(struct kbase_context *kctx)
- 	spin_lock_irqsave(&kbdev->hwcnt.lock, flags);
- 
- 	/* Check it's the context previously set up and we're not already
--	 * dumping */
-+	 * dumping
-+	 */
- 	if (kbdev->hwcnt.kctx != kctx || kbdev->hwcnt.backend.state !=
- 							KBASE_INSTR_STATE_IDLE)
- 		goto out;
-@@ -373,39 +325,45 @@ KBASE_EXPORT_SYMBOL(kbase_instr_hwcnt_clear);
- 
- int kbase_instr_backend_init(struct kbase_device *kbdev)
- {
--	int ret = 0;
-+	spin_lock_init(&kbdev->hwcnt.lock);
- 
- 	kbdev->hwcnt.backend.state = KBASE_INSTR_STATE_DISABLED;
- 
- 	init_waitqueue_head(&kbdev->hwcnt.backend.wait);
--	INIT_WORK(&kbdev->hwcnt.backend.cache_clean_work,
--						kbasep_cache_clean_worker);
--
- 
- 	kbdev->hwcnt.backend.triggered = 0;
- 
--#ifdef CONFIG_MALI_PRFCNT_SET_SECONDARY_VIA_DEBUG_FS
--	kbdev->hwcnt.backend.use_secondary_override = false;
-+#ifdef CONFIG_MALI_PRFCNT_SET_SELECT_VIA_DEBUG_FS
-+/* Use the build time option for the override default. */
-+#if defined(CONFIG_MALI_PRFCNT_SET_SECONDARY)
-+	kbdev->hwcnt.backend.override_counter_set = KBASE_HWCNT_SET_SECONDARY;
-+#elif defined(CONFIG_MALI_PRFCNT_SET_TERTIARY)
-+	kbdev->hwcnt.backend.override_counter_set = KBASE_HWCNT_SET_TERTIARY;
-+#else
-+	/* Default to primary */
-+	kbdev->hwcnt.backend.override_counter_set = KBASE_HWCNT_SET_PRIMARY;
- #endif
--
--	kbdev->hwcnt.backend.cache_clean_wq =
--			alloc_workqueue("Mali cache cleaning workqueue", 0, 1);
--	if (NULL == kbdev->hwcnt.backend.cache_clean_wq)
--		ret = -EINVAL;
--
--	return ret;
-+#endif
-+	return 0;
- }
- 
- void kbase_instr_backend_term(struct kbase_device *kbdev)
- {
--	destroy_workqueue(kbdev->hwcnt.backend.cache_clean_wq);
-+	CSTD_UNUSED(kbdev);
- }
- 
--#ifdef CONFIG_MALI_PRFCNT_SET_SECONDARY_VIA_DEBUG_FS
-+#ifdef CONFIG_MALI_PRFCNT_SET_SELECT_VIA_DEBUG_FS
- void kbase_instr_backend_debugfs_init(struct kbase_device *kbdev)
- {
--	debugfs_create_bool("hwcnt_use_secondary", S_IRUGO | S_IWUSR,
--		kbdev->mali_debugfs_directory,
--		&kbdev->hwcnt.backend.use_secondary_override);
-+	/* No validation is done on the debugfs input. Invalid input could cause
-+	 * performance counter errors. This is acceptable since this is a debug
-+	 * only feature and users should know what they are doing.
-+	 *
-+	 * Valid inputs are the values accepted bythe SET_SELECT bits of the
-+	 * PRFCNT_CONFIG register as defined in the architecture specification.
-+	*/
-+	debugfs_create_u8("hwcnt_set_select", S_IRUGO | S_IWUSR,
-+			  kbdev->mali_debugfs_directory,
-+			  (u8 *)&kbdev->hwcnt.backend.override_counter_set);
- }
- #endif
-diff --git a/dvalin/kernel/drivers/gpu/arm/midgard/backend/gpu/mali_kbase_instr_defs.h b/dvalin/kernel/drivers/gpu/arm/midgard/backend/gpu/mali_kbase_instr_defs.h
-index 9930968..e356348 100644
---- a/dvalin/kernel/drivers/gpu/arm/midgard/backend/gpu/mali_kbase_instr_defs.h
-+++ b/dvalin/kernel/drivers/gpu/arm/midgard/backend/gpu/mali_kbase_instr_defs.h
-@@ -1,11 +1,12 @@
-+/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
- /*
-  *
-- * (C) COPYRIGHT 2014, 2016, 2018, 2019-2020 ARM Limited. All rights reserved.
-+ * (C) COPYRIGHT 2014, 2016, 2018-2021 ARM Limited. All rights reserved.
-  *
-  * This program is free software and is provided to you under the terms of the
-  * GNU General Public License version 2 as published by the Free Software
-  * Foundation, and any use by you of this program is subject to the terms
-- * of such GNU licence.
-+ * of such GNU license.
-  *
-  * This program is distributed in the hope that it will be useful,
-  * but WITHOUT ANY WARRANTY; without even the implied warranty of
-@@ -16,8 +17,6 @@
-  * along with this program; if not, you can access it online at
-  * http://www.gnu.org/licenses/gpl-2.0.html.
-  *
-- * SPDX-License-Identifier: GPL-2.0
-- *
-  */
- 
- /*
-@@ -27,6 +26,8 @@
- #ifndef _KBASE_INSTR_DEFS_H_
- #define _KBASE_INSTR_DEFS_H_
- 
-+#include <mali_kbase_hwcnt_gpu.h>
-+
- /*
-  * Instrumentation State Machine States
-  */
-@@ -37,8 +38,6 @@ enum kbase_instr_state {
- 	KBASE_INSTR_STATE_IDLE,
- 	/* Hardware is currently dumping a frame. */
- 	KBASE_INSTR_STATE_DUMPING,
--	/* We've requested a clean to occur on a workqueue */
--	KBASE_INSTR_STATE_REQUEST_CLEAN,
- 	/* An error has occured during DUMPING (page fault). */
- 	KBASE_INSTR_STATE_FAULT
- };
-@@ -47,14 +46,11 @@ enum kbase_instr_state {
- struct kbase_instr_backend {
- 	wait_queue_head_t wait;
- 	int triggered;
--#ifdef CONFIG_MALI_PRFCNT_SET_SECONDARY_VIA_DEBUG_FS
--	bool use_secondary_override;
-+#ifdef CONFIG_MALI_PRFCNT_SET_SELECT_VIA_DEBUG_FS
-+	enum kbase_hwcnt_physical_set override_counter_set;
- #endif
- 
- 	enum kbase_instr_state state;
--	struct workqueue_struct *cache_clean_wq;
--	struct work_struct  cache_clean_work;
- };
- 
- #endif /* _KBASE_INSTR_DEFS_H_ */
--
-diff --git a/dvalin/kernel/drivers/gpu/arm/midgard/backend/gpu/mali_kbase_instr_internal.h b/dvalin/kernel/drivers/gpu/arm/midgard/backend/gpu/mali_kbase_instr_internal.h
-index 2254b9f..332cc69 100644
---- a/dvalin/kernel/drivers/gpu/arm/midgard/backend/gpu/mali_kbase_instr_internal.h
-+++ b/dvalin/kernel/drivers/gpu/arm/midgard/backend/gpu/mali_kbase_instr_internal.h
-@@ -1,11 +1,12 @@
-+/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
- /*
-  *
-- * (C) COPYRIGHT 2014, 2018 ARM Limited. All rights reserved.
-+ * (C) COPYRIGHT 2014, 2018, 2020-2021 ARM Limited. All rights reserved.
-  *
-  * This program is free software and is provided to you under the terms of the
-  * GNU General Public License version 2 as published by the Free Software
-  * Foundation, and any use by you of this program is subject to the terms
-- * of such GNU licence.
-+ * of such GNU license.
-  *
-  * This program is distributed in the hope that it will be useful,
-  * but WITHOUT ANY WARRANTY; without even the implied warranty of
-@@ -16,12 +17,8 @@
-  * along with this program; if not, you can access it online at
-  * http://www.gnu.org/licenses/gpl-2.0.html.
-  *
-- * SPDX-License-Identifier: GPL-2.0
-- *
-  */
- 
--
--
- /*
-  * Backend-specific HW access instrumentation APIs
-  */
-diff --git a/dvalin/kernel/drivers/gpu/arm/midgard/backend/gpu/mali_kbase_irq_internal.h b/dvalin/kernel/drivers/gpu/arm/midgard/backend/gpu/mali_kbase_irq_internal.h
-index ca3c048..2671ce5 100644
---- a/dvalin/kernel/drivers/gpu/arm/midgard/backend/gpu/mali_kbase_irq_internal.h
-+++ b/dvalin/kernel/drivers/gpu/arm/midgard/backend/gpu/mali_kbase_irq_internal.h
-@@ -1,11 +1,12 @@
-+/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
- /*
-  *
-- * (C) COPYRIGHT 2014-2015 ARM Limited. All rights reserved.
-+ * (C) COPYRIGHT 2014-2015, 2020-2021 ARM Limited. All rights reserved.
-  *
-  * This program is free software and is provided to you under the terms of the
-  * GNU General Public License version 2 as published by the Free Software
-  * Foundation, and any use by you of this program is subject to the terms
-- * of such GNU licence.
-+ * of such GNU license.
-  *
-  * This program is distributed in the hope that it will be useful,
-  * but WITHOUT ANY WARRANTY; without even the implied warranty of
-@@ -16,8 +17,6 @@
-  * along with this program; if not, you can access it online at
-  * http://www.gnu.org/licenses/gpl-2.0.html.
-  *
-- * SPDX-License-Identifier: GPL-2.0
-- *
-  */
- 
- /*
-diff --git a/dvalin/kernel/drivers/gpu/arm/midgard/backend/gpu/mali_kbase_irq_linux.c b/dvalin/kernel/drivers/gpu/arm/midgard/backend/gpu/mali_kbase_irq_linux.c
-index 8696c6a..a29f7ef 100644
---- a/dvalin/kernel/drivers/gpu/arm/midgard/backend/gpu/mali_kbase_irq_linux.c
-+++ b/dvalin/kernel/drivers/gpu/arm/midgard/backend/gpu/mali_kbase_irq_linux.c
-@@ -1,11 +1,12 @@
-+// SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note
- /*
-  *
-- * (C) COPYRIGHT 2014-2016,2018-2020 ARM Limited. All rights reserved.
-+ * (C) COPYRIGHT 2014-2016, 2018-2021 ARM Limited. All rights reserved.
-  *
-  * This program is free software and is provided to you under the terms of the
-  * GNU General Public License version 2 as published by the Free Software
-  * Foundation, and any use by you of this program is subject to the terms
-- * of such GNU licence.
-+ * of such GNU license.
-  *
-  * This program is distributed in the hope that it will be useful,
-  * but WITHOUT ANY WARRANTY; without even the implied warranty of
-@@ -16,17 +17,15 @@
-  * along with this program; if not, you can access it online at
-  * http://www.gnu.org/licenses/gpl-2.0.html.
-  *
-- * SPDX-License-Identifier: GPL-2.0
-- *
-  */
- 
- #include <mali_kbase.h>
--#include <backend/gpu/mali_kbase_device_internal.h>
-+#include <device/mali_kbase_device.h>
- #include <backend/gpu/mali_kbase_irq_internal.h>
- 
- #include <linux/interrupt.h>
- 
--#if !defined(CONFIG_MALI_NO_MALI)
-+#if !IS_ENABLED(CONFIG_MALI_NO_MALI)
- 
- /* GPU IRQ Tags */
- #define	JOB_IRQ_TAG	0
-@@ -72,7 +71,12 @@ static irqreturn_t kbase_job_irq_handler(int irq, void *data)
- 
- 	dev_dbg(kbdev->dev, "%s: irq %d irqstatus 0x%x\n", __func__, irq, val);
- 
-+#if MALI_USE_CSF
-+	/* call the csf interrupt handler */
-+	kbase_csf_interrupt(kbdev, val);
-+#else
- 	kbase_job_done(kbdev, val);
-+#endif
- 
- 	spin_unlock_irqrestore(&kbdev->hwaccess_lock, flags);
- 
-@@ -210,24 +214,25 @@ int kbase_set_custom_irq_handler(struct kbase_device *kbdev,
- 	int result = 0;
- 	irq_handler_t requested_irq_handler = NULL;
- 
--	KBASE_DEBUG_ASSERT((JOB_IRQ_HANDLER <= irq_type) &&
--						(GPU_IRQ_HANDLER >= irq_type));
-+	KBASE_DEBUG_ASSERT((irq_type >= JOB_IRQ_HANDLER) &&
-+			   (irq_type <= GPU_IRQ_HANDLER));
- 
- 	/* Release previous handler */
- 	if (kbdev->irqs[irq_type].irq)
- 		free_irq(kbdev->irqs[irq_type].irq, kbase_tag(kbdev, irq_type));
- 
--	requested_irq_handler = (NULL != custom_handler) ? custom_handler :
--						kbase_handler_table[irq_type];
-+	requested_irq_handler = (custom_handler != NULL) ?
-+					custom_handler :
-+					kbase_handler_table[irq_type];
- 
--	if (0 != request_irq(kbdev->irqs[irq_type].irq,
--			requested_irq_handler,
-+	if (request_irq(kbdev->irqs[irq_type].irq, requested_irq_handler,
- 			kbdev->irqs[irq_type].flags | IRQF_SHARED,
--			dev_name(kbdev->dev), kbase_tag(kbdev, irq_type))) {
-+			dev_name(kbdev->dev),
-+			kbase_tag(kbdev, irq_type)) != 0) {
- 		result = -EINVAL;
- 		dev_err(kbdev->dev, "Can't request interrupt %d (index %d)\n",
- 					kbdev->irqs[irq_type].irq, irq_type);
--#ifdef CONFIG_SPARSE_IRQ
-+#if IS_ENABLED(CONFIG_SPARSE_IRQ)
- 		dev_err(kbdev->dev, "You have CONFIG_SPARSE_IRQ support enabled - is the interrupt number correct for this configuration?\n");
- #endif /* CONFIG_SPARSE_IRQ */
- 	}
-@@ -456,7 +461,7 @@ int kbase_install_interrupts(struct kbase_device *kbdev)
- 		if (err) {
- 			dev_err(kbdev->dev, "Can't request interrupt %d (index %d)\n",
- 							kbdev->irqs[i].irq, i);
--#ifdef CONFIG_SPARSE_IRQ
-+#if IS_ENABLED(CONFIG_SPARSE_IRQ)
- 			dev_err(kbdev->dev, "You have CONFIG_SPARSE_IRQ support enabled - is the interrupt number correct for this configuration?\n");
- #endif /* CONFIG_SPARSE_IRQ */
- 			goto release;
-@@ -496,4 +501,4 @@ void kbase_synchronize_irqs(struct kbase_device *kbdev)
- 
- KBASE_EXPORT_TEST_API(kbase_synchronize_irqs);
- 
--#endif /* !defined(CONFIG_MALI_NO_MALI) */
-+#endif /* !IS_ENABLED(CONFIG_MALI_NO_MALI) */
-diff --git a/dvalin/kernel/drivers/gpu/arm/midgard/backend/gpu/mali_kbase_jm_as.c b/dvalin/kernel/drivers/gpu/arm/midgard/backend/gpu/mali_kbase_jm_as.c
-index bb4f548..888aa59 100644
---- a/dvalin/kernel/drivers/gpu/arm/midgard/backend/gpu/mali_kbase_jm_as.c
-+++ b/dvalin/kernel/drivers/gpu/arm/midgard/backend/gpu/mali_kbase_jm_as.c
-@@ -1,11 +1,12 @@
-+// SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note
- /*
-  *
-- * (C) COPYRIGHT 2014-2020 ARM Limited. All rights reserved.
-+ * (C) COPYRIGHT 2014-2021 ARM Limited. All rights reserved.
-  *
-  * This program is free software and is provided to you under the terms of the
-  * GNU General Public License version 2 as published by the Free Software
-  * Foundation, and any use by you of this program is subject to the terms
-- * of such GNU licence.
-+ * of such GNU license.
-  *
-  * This program is distributed in the hope that it will be useful,
-  * but WITHOUT ANY WARRANTY; without even the implied warranty of
-@@ -16,11 +17,8 @@
-  * along with this program; if not, you can access it online at
-  * http://www.gnu.org/licenses/gpl-2.0.html.
-  *
-- * SPDX-License-Identifier: GPL-2.0
-- *
-  */
- 
--
- /*
-  * Register backend context / address space management
-  */
-@@ -58,8 +56,10 @@ static void assign_and_activate_kctx_addr_space(struct kbase_device *kbdev,
- 	lockdep_assert_held(&js_devdata->runpool_mutex);
- 	lockdep_assert_held(&kbdev->hwaccess_lock);
- 
-+#if !MALI_USE_CSF
- 	/* Attribute handling */
- 	kbasep_js_ctx_attr_runpool_retain_ctx(kbdev, kctx);
-+#endif
- 
- 	/* Allow it to run jobs */
- 	kbasep_js_set_submit_allowed(js_devdata, kctx);
-@@ -188,8 +188,8 @@ int kbase_backend_find_and_release_free_address_space(
- 			}
- 
- 			/* Context was retained while locks were dropped,
--			 * continue looking for free AS */
--
-+			 * continue looking for free AS
-+			 */
- 			mutex_unlock(&js_devdata->runpool_mutex);
- 			mutex_unlock(&as_js_kctx_info->ctx.jsctx_mutex);
- 
-diff --git a/dvalin/kernel/drivers/gpu/arm/midgard/backend/gpu/mali_kbase_jm_defs.h b/dvalin/kernel/drivers/gpu/arm/midgard/backend/gpu/mali_kbase_jm_defs.h
-index 7cda61a..e29ace7 100644
---- a/dvalin/kernel/drivers/gpu/arm/midgard/backend/gpu/mali_kbase_jm_defs.h
-+++ b/dvalin/kernel/drivers/gpu/arm/midgard/backend/gpu/mali_kbase_jm_defs.h
-@@ -1,11 +1,12 @@
-+/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
- /*
-  *
-- * (C) COPYRIGHT 2014-2016, 2018-2019 ARM Limited. All rights reserved.
-+ * (C) COPYRIGHT 2014-2021 ARM Limited. All rights reserved.
-  *
-  * This program is free software and is provided to you under the terms of the
-  * GNU General Public License version 2 as published by the Free Software
-  * Foundation, and any use by you of this program is subject to the terms
-- * of such GNU licence.
-+ * of such GNU license.
-  *
-  * This program is distributed in the hope that it will be useful,
-  * but WITHOUT ANY WARRANTY; without even the implied warranty of
-@@ -16,11 +17,8 @@
-  * along with this program; if not, you can access it online at
-  * http://www.gnu.org/licenses/gpl-2.0.html.
-  *
-- * SPDX-License-Identifier: GPL-2.0
-- *
-  */
- 
--
- /*
-  * Register-based HW access backend specific definitions
-  */
-@@ -78,11 +76,12 @@ struct slot_rb {
-  * The hwaccess_lock (a spinlock) must be held when accessing this structure
-  */
- struct kbase_backend_data {
-+#if !MALI_USE_CSF
- 	struct slot_rb slot_rb[BASE_JM_MAX_NR_SLOTS];
--
- 	struct hrtimer scheduling_timer;
- 
- 	bool timer_running;
-+#endif
- 	bool suspend_timer;
- 
- 	atomic_t reset_gpu;
-@@ -92,13 +91,16 @@ struct kbase_backend_data {
- /* kbase_prepare_to_reset_gpu has been called */
- #define KBASE_RESET_GPU_PREPARED        1
- /* kbase_reset_gpu has been called - the reset will now definitely happen
-- * within the timeout period */
-+ * within the timeout period
-+ */
- #define KBASE_RESET_GPU_COMMITTED       2
- /* The GPU reset process is currently occuring (timeout has expired or
-- * kbasep_try_reset_gpu_early was called) */
-+ * kbasep_try_reset_gpu_early was called)
-+ */
- #define KBASE_RESET_GPU_HAPPENING       3
- /* Reset the GPU silently, used when resetting the GPU as part of normal
-- * behavior (e.g. when exiting protected mode). */
-+ * behavior (e.g. when exiting protected mode).
-+ */
- #define KBASE_RESET_GPU_SILENT          4
- 	struct workqueue_struct *reset_workq;
- 	struct work_struct reset_work;
-diff --git a/dvalin/kernel/drivers/gpu/arm/midgard/backend/gpu/mali_kbase_jm_hw.c b/dvalin/kernel/drivers/gpu/arm/midgard/backend/gpu/mali_kbase_jm_hw.c
-index fa6bc83..ae0377f 100644
---- a/dvalin/kernel/drivers/gpu/arm/midgard/backend/gpu/mali_kbase_jm_hw.c
-+++ b/dvalin/kernel/drivers/gpu/arm/midgard/backend/gpu/mali_kbase_jm_hw.c
-@@ -1,11 +1,12 @@
-+// SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note
- /*
-  *
-- * (C) COPYRIGHT 2010-2020 ARM Limited. All rights reserved.
-+ * (C) COPYRIGHT 2010-2021 ARM Limited. All rights reserved.
-  *
-  * This program is free software and is provided to you under the terms of the
-  * GNU General Public License version 2 as published by the Free Software
-  * Foundation, and any use by you of this program is subject to the terms
-- * of such GNU licence.
-+ * of such GNU license.
-  *
-  * This program is distributed in the hope that it will be useful,
-  * but WITHOUT ANY WARRANTY; without even the implied warranty of
-@@ -16,8 +17,6 @@
-  * along with this program; if not, you can access it online at
-  * http://www.gnu.org/licenses/gpl-2.0.html.
-  *
-- * SPDX-License-Identifier: GPL-2.0
-- *
-  */
- 
- /*
-@@ -33,16 +32,20 @@
- #include <mali_kbase_hwaccess_jm.h>
- #include <mali_kbase_reset_gpu.h>
- #include <mali_kbase_ctx_sched.h>
-+#include <mali_kbase_kinstr_jm.h>
- #include <mali_kbase_hwcnt_context.h>
--#include <backend/gpu/mali_kbase_device_internal.h>
-+#include <device/mali_kbase_device.h>
- #include <backend/gpu/mali_kbase_irq_internal.h>
- #include <backend/gpu/mali_kbase_jm_internal.h>
-+#include <mali_kbase_regs_history_debugfs.h>
- 
- static void kbasep_try_reset_gpu_early_locked(struct kbase_device *kbdev);
-+static u64 kbasep_apply_limited_core_mask(const struct kbase_device *kbdev,
-+				const u64 affinity, const u64 limited_core_mask);
- 
- static u64 kbase_job_write_affinity(struct kbase_device *kbdev,
- 				base_jd_core_req core_req,
--				int js)
-+				int js, const u64 limited_core_mask)
- {
- 	u64 affinity;
- 
-@@ -71,14 +74,21 @@ static u64 kbase_job_write_affinity(struct kbase_device *kbdev,
- 		 */
- 		if (js == 2 && num_core_groups > 1)
- 			affinity &= coherency_info->group[1].core_mask;
--		else
-+		else if (num_core_groups > 1)
- 			affinity &= coherency_info->group[0].core_mask;
-+		else
-+			affinity &= kbdev->gpu_props.curr_config.shader_present;
- 	} else {
- 		/* Use all cores */
- 		affinity = kbdev->pm.backend.shaders_avail &
- 				kbdev->pm.debug_core_mask[js];
- 	}
- 
-+	if (core_req & BASE_JD_REQ_LIMITED_CORE_MASK) {
-+		/* Limiting affinity due to BASE_JD_REQ_LIMITED_CORE_MASK by applying the limited core mask. */
-+		affinity = kbasep_apply_limited_core_mask(kbdev, affinity, limited_core_mask);
-+	}
-+
- 	if (unlikely(!affinity)) {
- #ifdef CONFIG_MALI_DEBUG
- 		u64 shaders_ready =
-@@ -88,6 +98,16 @@ static u64 kbase_job_write_affinity(struct kbase_device *kbdev,
- #endif
- 
- 		affinity = kbdev->pm.backend.shaders_avail;
-+
-+		if (core_req & BASE_JD_REQ_LIMITED_CORE_MASK) {
-+			/* Limiting affinity again to make sure it only enables shader cores with backed TLS memory. */
-+			affinity = kbasep_apply_limited_core_mask(kbdev, affinity, limited_core_mask);
-+
-+#ifdef CONFIG_MALI_DEBUG
-+			/* affinity should never be 0 */
-+			WARN_ON(!affinity);
-+#endif
-+		}
- 	}
- 
- 	kbase_reg_write(kbdev, JOB_SLOT_REG(js, JS_AFFINITY_NEXT_LO),
-@@ -168,7 +188,7 @@ static u64 select_job_chain(struct kbase_jd_atom *katom)
- 	}
- 
- 	dev_dbg(kctx->kbdev->dev,
--		"Selected job chain 0x%llx for end atom %p in state %d\n",
-+		"Selected job chain 0x%llx for end atom %pK in state %d\n",
- 		jc, (void *)katom, (int)rp->state);
- 
- 	katom->jc = jc;
-@@ -192,7 +212,7 @@ void kbase_job_hw_submit(struct kbase_device *kbdev,
- 	/* Command register must be available */
- 	KBASE_DEBUG_ASSERT(kbasep_jm_is_js_free(kbdev, js, kctx));
- 
--	dev_dbg(kctx->kbdev->dev, "Write JS_HEAD_NEXT 0x%llx for atom %p\n",
-+	dev_dbg(kctx->kbdev->dev, "Write JS_HEAD_NEXT 0x%llx for atom %pK\n",
- 		jc_head, (void *)katom);
- 
- 	kbase_reg_write(kbdev, JOB_SLOT_REG(js, JS_HEAD_NEXT_LO),
-@@ -200,10 +220,12 @@ void kbase_job_hw_submit(struct kbase_device *kbdev,
- 	kbase_reg_write(kbdev, JOB_SLOT_REG(js, JS_HEAD_NEXT_HI),
- 						jc_head >> 32);
- 
--	affinity = kbase_job_write_affinity(kbdev, katom->core_req, js);
-+	affinity = kbase_job_write_affinity(kbdev, katom->core_req, js,
-+						kctx->limited_core_mask);
- 
- 	/* start MMU, medium priority, cache clean/flush on end, clean/flush on
--	 * start */
-+	 * start
-+	 */
- 	cfg = kctx->as_nr;
- 
- 	if (kbase_hw_has_feature(kbdev, BASE_HW_FEATURE_FLUSH_REDUCTION) &&
-@@ -255,7 +277,7 @@ void kbase_job_hw_submit(struct kbase_device *kbdev,
- 	katom->start_timestamp = ktime_get();
- 
- 	/* GO ! */
--	dev_dbg(kbdev->dev, "JS: Submitting atom %p from ctx %p to js[%d] with head=0x%llx",
-+	dev_dbg(kbdev->dev, "JS: Submitting atom %pK from ctx %pK to js[%d] with head=0x%llx",
- 				katom, kctx, js, jc_head);
- 
- 	KBASE_KTRACE_ADD_JM_SLOT_INFO(kbdev, JM_SUBMIT, kctx, katom, jc_head, js,
-@@ -277,7 +299,8 @@ void kbase_job_hw_submit(struct kbase_device *kbdev,
- 			katom,
- 			&kbdev->gpu_props.props.raw_props.js_features[js],
- 			"ctx_nr,atom_nr");
--#ifdef CONFIG_GPU_TRACEPOINTS
-+	kbase_kinstr_jm_atom_hw_submit(katom);
-+#if IS_ENABLED(CONFIG_GPU_TRACEPOINTS)
- 	if (!kbase_backend_nr_atoms_submitted(kbdev, js)) {
- 		/* If this is the only job on the slot, trace it as starting */
- 		char js_string[16];
-@@ -328,7 +351,8 @@ static void kbasep_job_slot_update_head_start_timestamp(
- 			/* Only update the timestamp if it's a better estimate
- 			 * than what's currently stored. This is because our
- 			 * estimate that accounts for the throttle time may be
--			 * too much of an overestimate */
-+			 * too much of an overestimate
-+			 */
- 			katom->start_timestamp = end_timestamp;
- 		}
- 	}
-@@ -371,9 +395,9 @@ void kbase_job_done(struct kbase_device *kbdev, u32 done)
- 		/* treat failed slots as finished slots */
- 		u32 finished = (done & 0xFFFF) | failed;
- 
--		/* Note: This is inherently unfair, as we always check
--		 * for lower numbered interrupts before the higher
--		 * numbered ones.*/
-+		/* Note: This is inherently unfair, as we always check for lower
-+		 * numbered interrupts before the higher numbered ones.
-+		 */
- 		i = ffs(finished) - 1;
- 		KBASE_DEBUG_ASSERT(i >= 0);
- 
-@@ -385,7 +409,8 @@ void kbase_job_done(struct kbase_device *kbdev, u32 done)
- 
- 			if (failed & (1u << i)) {
- 				/* read out the job slot status code if the job
--				 * slot reported failure */
-+				 * slot reported failure
-+				 */
- 				completion_code = kbase_reg_read(kbdev,
- 					JOB_SLOT_REG(i, JS_STATUS));
- 
-@@ -399,7 +424,8 @@ void kbase_job_done(struct kbase_device *kbdev, u32 done)
- 
- 					/* Soft-stopped job - read the value of
- 					 * JS<n>_TAIL so that the job chain can
--					 * be resumed */
-+					 * be resumed
-+					 */
- 					job_tail = (u64)kbase_reg_read(kbdev,
- 						JOB_SLOT_REG(i, JS_TAIL_LO)) |
- 						((u64)kbase_reg_read(kbdev,
-@@ -408,21 +434,26 @@ void kbase_job_done(struct kbase_device *kbdev, u32 done)
- 				} else if (completion_code ==
- 						BASE_JD_EVENT_NOT_STARTED) {
- 					/* PRLAM-10673 can cause a TERMINATED
--					 * job to come back as NOT_STARTED, but
--					 * the error interrupt helps us detect
--					 * it */
-+					 * job to come back as NOT_STARTED,
-+					 * but the error interrupt helps us
-+					 * detect it
-+					 */
- 					completion_code =
- 						BASE_JD_EVENT_TERMINATED;
- 				}
- 
- 				kbase_gpu_irq_evict(kbdev, i, completion_code);
- 
--				/* Some jobs that encounter a BUS FAULT may result in corrupted
--				 * state causing future jobs to hang. Reset GPU before
--				 * allowing any other jobs on the slot to continue. */
-+				/* Some jobs that encounter a BUS FAULT may
-+				 * result in corrupted state causing future
-+				 * jobs to hang. Reset GPU before allowing
-+				 * any other jobs on the slot to continue.
-+				 */
- 				if (kbase_hw_has_issue(kbdev, BASE_HW_ISSUE_TTRX_3076)) {
- 					if (completion_code == BASE_JD_EVENT_JOB_BUS_FAULT) {
--						if (kbase_prepare_to_reset_gpu_locked(kbdev))
-+						if (kbase_prepare_to_reset_gpu_locked(
-+							    kbdev,
-+							    RESET_FLAGS_NONE))
- 							kbase_reset_gpu_locked(kbdev);
- 					}
- 				}
-@@ -480,7 +511,8 @@ void kbase_job_done(struct kbase_device *kbdev, u32 done)
- 
- 				if ((rawstat >> (i + 16)) & 1) {
- 					/* There is a failed job that we've
--					 * missed - add it back to active */
-+					 * missed - add it back to active
-+					 */
- 					active |= (1u << i);
- 				}
- 			}
-@@ -582,7 +614,8 @@ void kbasep_job_slot_soft_or_hard_stop_do_action(struct kbase_device *kbdev,
- 		}
- 
- 		/* We are about to issue a soft stop, so mark the atom as having
--		 * been soft stopped */
-+		 * been soft stopped
-+		 */
- 		target_katom->atom_flags |= KBASE_KATOM_FLAG_BEEN_SOFT_STOPPED;
- 
- 		/* Mark the point where we issue the soft-stop command */
-@@ -692,12 +725,40 @@ void kbase_backend_jm_kill_running_jobs_from_kctx(struct kbase_context *kctx)
- 		kbase_job_slot_hardstop(kctx, i, NULL);
- }
- 
-+/**
-+ * kbase_is_existing_atom_submitted_later_than_ready
-+ * @ready: sequence number of the ready atom
-+ * @existing: sequence number of the existing atom
-+ *
-+ * Returns true if the existing atom has been submitted later than the
-+ * ready atom. It is used to understand if an atom that is ready has been
-+ * submitted earlier than the currently running atom, so that the currently
-+ * running atom should be preempted to allow the ready atom to run.
-+ */
-+static inline bool kbase_is_existing_atom_submitted_later_than_ready(u64 ready, u64 existing)
-+{
-+	/* No seq_nr set? */
-+	if (!ready || !existing)
-+		return false;
-+
-+	/* Efficiently handle the unlikely case of wrapping.
-+	 * The following code assumes that the delta between the sequence number
-+	 * of the two atoms is less than INT64_MAX.
-+	 * In the extremely unlikely case where the delta is higher, the comparison
-+	 * defaults for no preemption.
-+	 * The code also assumes that the conversion from unsigned to signed types
-+	 * works because the signed integers are 2's complement.
-+	 */
-+	return (s64)(ready - existing) < 0;
-+}
-+
- void kbase_job_slot_ctx_priority_check_locked(struct kbase_context *kctx,
- 				struct kbase_jd_atom *target_katom)
- {
- 	struct kbase_device *kbdev;
- 	int js = target_katom->slot_nr;
- 	int priority = target_katom->sched_priority;
-+	int seq_nr = target_katom->seq_nr;
- 	int i;
- 	bool stop_sent = false;
- 
-@@ -719,7 +780,8 @@ void kbase_job_slot_ctx_priority_check_locked(struct kbase_context *kctx,
- 				(katom->kctx != kctx))
- 			continue;
- 
--		if (katom->sched_priority > priority) {
-+		if ((katom->sched_priority > priority) ||
-+		    (katom->kctx == kctx && kbase_is_existing_atom_submitted_later_than_ready(seq_nr, katom->seq_nr))) {
- 			if (!stop_sent)
- 				KBASE_TLSTREAM_TL_ATTRIB_ATOM_PRIORITIZED(
- 						kbdev,
-@@ -749,7 +811,7 @@ static int softstop_start_rp_nolock(
- 
- 	if (!(katom->core_req & BASE_JD_REQ_START_RENDERPASS)) {
- 		dev_dbg(kctx->kbdev->dev,
--			"Atom %p on job slot is not start RP\n", (void *)katom);
-+			"Atom %pK on job slot is not start RP\n", (void *)katom);
- 		return -EPERM;
- 	}
- 
-@@ -762,13 +824,13 @@ static int softstop_start_rp_nolock(
- 		rp->state != KBASE_JD_RP_RETRY))
- 		return -EINVAL;
- 
--	dev_dbg(kctx->kbdev->dev, "OOM in state %d with region %p\n",
-+	dev_dbg(kctx->kbdev->dev, "OOM in state %d with region %pK\n",
- 		(int)rp->state, (void *)reg);
- 
- 	if (WARN_ON(katom != rp->start_katom))
- 		return -EINVAL;
- 
--	dev_dbg(kctx->kbdev->dev, "Adding region %p to list %p\n",
-+	dev_dbg(kctx->kbdev->dev, "Adding region %pK to list %pK\n",
- 		(void *)reg, (void *)&rp->oom_reg_list);
- 	list_move_tail(&reg->link, &rp->oom_reg_list);
- 	dev_dbg(kctx->kbdev->dev, "Added region to list\n");
-@@ -813,9 +875,9 @@ void kbase_jm_wait_for_zero_jobs(struct kbase_context *kctx)
- 	if (timeout != 0)
- 		goto exit;
- 
--	if (kbase_prepare_to_reset_gpu(kbdev)) {
-+	if (kbase_prepare_to_reset_gpu(kbdev, RESET_FLAGS_NONE)) {
- 		dev_err(kbdev->dev,
--			"Issueing GPU soft-reset because jobs failed to be killed (within %d ms) as part of context termination (e.g. process exit)\n",
-+			"Issuing GPU soft-reset because jobs failed to be killed (within %d ms) as part of context termination (e.g. process exit)\n",
- 			ZAP_TIMEOUT);
- 		kbase_reset_gpu(kbdev);
- 	}
-@@ -823,7 +885,7 @@ void kbase_jm_wait_for_zero_jobs(struct kbase_context *kctx)
- 	/* Wait for the reset to complete */
- 	kbase_reset_gpu_wait(kbdev);
- exit:
--	dev_dbg(kbdev->dev, "Zap: Finished Context %p", kctx);
-+	dev_dbg(kbdev->dev, "Zap: Finished Context %pK", kctx);
- 
- 	/* Ensure that the signallers of the waitqs have finished */
- 	mutex_lock(&kctx->jctx.lock);
-@@ -884,7 +946,7 @@ KBASE_EXPORT_TEST_API(kbase_job_slot_term);
- void kbase_job_slot_softstop_swflags(struct kbase_device *kbdev, int js,
- 			struct kbase_jd_atom *target_katom, u32 sw_flags)
- {
--	dev_dbg(kbdev->dev, "Soft-stop atom %p with flags 0x%x (s:%d)\n",
-+	dev_dbg(kbdev->dev, "Soft-stop atom %pK with flags 0x%x (s:%d)\n",
- 		target_katom, sw_flags, js);
- 
- 	KBASE_DEBUG_ASSERT(!(sw_flags & JS_COMMAND_MASK));
-@@ -988,6 +1050,33 @@ void kbase_job_check_leave_disjoint(struct kbase_device *kbdev,
- 	}
- }
- 
-+int kbase_reset_gpu_prevent_and_wait(struct kbase_device *kbdev)
-+{
-+	WARN(true, "%s Not implemented for JM GPUs", __func__);
-+	return -EINVAL;
-+}
-+
-+int kbase_reset_gpu_try_prevent(struct kbase_device *kbdev)
-+{
-+	WARN(true, "%s Not implemented for JM GPUs", __func__);
-+	return -EINVAL;
-+}
-+
-+void kbase_reset_gpu_allow(struct kbase_device *kbdev)
-+{
-+	WARN(true, "%s Not implemented for JM GPUs", __func__);
-+}
-+
-+void kbase_reset_gpu_assert_prevented(struct kbase_device *kbdev)
-+{
-+	WARN(true, "%s Not implemented for JM GPUs", __func__);
-+}
-+
-+void kbase_reset_gpu_assert_failed_or_prevented(struct kbase_device *kbdev)
-+{
-+	WARN(true, "%s Not implemented for JM GPUs", __func__);
-+}
-+
- static void kbase_debug_dump_registers(struct kbase_device *kbdev)
- {
- 	int i;
-@@ -1054,13 +1143,15 @@ static void kbasep_reset_timeout_worker(struct work_struct *data)
- 
- 	/* Make sure the timer has completed - this cannot be done from
- 	 * interrupt context, so this cannot be done within
--	 * kbasep_try_reset_gpu_early. */
-+	 * kbasep_try_reset_gpu_early.
-+	 */
- 	hrtimer_cancel(&kbdev->hwaccess.backend.reset_timer);
- 
- 	if (kbase_pm_context_active_handle_suspend(kbdev,
- 				KBASE_PM_SUSPEND_HANDLER_DONT_REACTIVATE)) {
- 		/* This would re-activate the GPU. Since it's already idle,
--		 * there's no need to reset it */
-+		 * there's no need to reset it
-+		 */
- 		atomic_set(&kbdev->hwaccess.backend.reset_gpu,
- 						KBASE_RESET_GPU_NOT_PENDING);
- 		kbase_disjoint_state_down(kbdev);
-@@ -1081,14 +1172,16 @@ static void kbasep_reset_timeout_worker(struct work_struct *data)
- 	kbdev->irq_reset_flush = true;
- 
- 	/* Disable IRQ to avoid IRQ handlers to kick in after releasing the
--	 * spinlock; this also clears any outstanding interrupts */
-+	 * spinlock; this also clears any outstanding interrupts
-+	 */
- 	kbase_pm_disable_interrupts_nolock(kbdev);
- 
- 	spin_unlock(&kbdev->mmu_mask_change);
- 	spin_unlock_irqrestore(&kbdev->hwaccess_lock, flags);
- 
- 	/* Ensure that any IRQ handlers have finished
--	 * Must be done without any locks IRQ handlers will take */
-+	 * Must be done without any locks IRQ handlers will take
-+	 */
- 	kbase_synchronize_irqs(kbdev);
- 
- 	/* Flush out any in-flight work items */
-@@ -1099,7 +1192,8 @@ static void kbasep_reset_timeout_worker(struct work_struct *data)
- 
- 	if (kbase_hw_has_issue(kbdev, BASE_HW_ISSUE_TMIX_8463)) {
- 		/* Ensure that L2 is not transitioning when we send the reset
--		 * command */
-+		 * command
-+		 */
- 		while (--max_loops && kbase_pm_get_trans_cores(kbdev,
- 				KBASE_PM_CORE_L2))
- 			;
-@@ -1114,14 +1208,16 @@ static void kbasep_reset_timeout_worker(struct work_struct *data)
- 	/* All slot have been soft-stopped and we've waited
- 	 * SOFT_STOP_RESET_TIMEOUT for the slots to clear, at this point we
- 	 * assume that anything that is still left on the GPU is stuck there and
--	 * we'll kill it when we reset the GPU */
-+	 * we'll kill it when we reset the GPU
-+	 */
- 
- 	if (!silent)
- 		dev_err(kbdev->dev, "Resetting GPU (allowing up to %d ms)",
- 								RESET_TIMEOUT);
- 
- 	/* Output the state of some interesting registers to help in the
--	 * debugging of GPU resets */
-+	 * debugging of GPU resets
-+	 */
- 	if (!silent)
- 		kbase_debug_dump_registers(kbdev);
- 
-@@ -1160,7 +1256,8 @@ static void kbasep_reset_timeout_worker(struct work_struct *data)
- 	kbase_pm_update_cores_state(kbdev);
- 
- 	/* Synchronously request and wait for those cores, because if
--	 * instrumentation is enabled it would need them immediately. */
-+	 * instrumentation is enabled it would need them immediately.
-+	 */
- 	kbase_pm_wait_for_desired_state(kbdev);
- 
- 	mutex_unlock(&kbdev->pm.lock);
-@@ -1237,7 +1334,8 @@ static void kbasep_try_reset_gpu_early_locked(struct kbase_device *kbdev)
- 
- 	/* Check that the reset has been committed to (i.e. kbase_reset_gpu has
- 	 * been called), and that no other thread beat this thread to starting
--	 * the reset */
-+	 * the reset
-+	 */
- 	if (atomic_cmpxchg(&kbdev->hwaccess.backend.reset_gpu,
- 			KBASE_RESET_GPU_COMMITTED, KBASE_RESET_GPU_HAPPENING) !=
- 						KBASE_RESET_GPU_COMMITTED) {
-@@ -1261,6 +1359,7 @@ static void kbasep_try_reset_gpu_early(struct kbase_device *kbdev)
- /**
-  * kbase_prepare_to_reset_gpu_locked - Prepare for resetting the GPU
-  * @kbdev: kbase device
-+ * @flags: Bitfield indicating impact of reset (see flag defines)
-  *
-  * This function just soft-stops all the slots to ensure that as many jobs as
-  * possible are saved.
-@@ -1271,12 +1370,23 @@ static void kbasep_try_reset_gpu_early(struct kbase_device *kbdev)
-  *   false - Another thread is performing a reset, kbase_reset_gpu should
-  *   not be called.
-  */
--bool kbase_prepare_to_reset_gpu_locked(struct kbase_device *kbdev)
-+bool kbase_prepare_to_reset_gpu_locked(struct kbase_device *kbdev,
-+				       unsigned int flags)
- {
- 	int i;
- 
-+	CSTD_UNUSED(flags);
- 	KBASE_DEBUG_ASSERT(kbdev);
- 
-+#ifdef CONFIG_MALI_ARBITER_SUPPORT
-+	if (kbase_pm_is_gpu_lost(kbdev)) {
-+		/* GPU access has been removed, reset will be done by
-+		 * Arbiter instead
-+		 */
-+		return false;
-+	}
-+#endif
-+
- 	if (atomic_cmpxchg(&kbdev->hwaccess.backend.reset_gpu,
- 						KBASE_RESET_GPU_NOT_PENDING,
- 						KBASE_RESET_GPU_PREPARED) !=
-@@ -1293,14 +1403,14 @@ bool kbase_prepare_to_reset_gpu_locked(struct kbase_device *kbdev)
- 	return true;
- }
- 
--bool kbase_prepare_to_reset_gpu(struct kbase_device *kbdev)
-+bool kbase_prepare_to_reset_gpu(struct kbase_device *kbdev, unsigned int flags)
- {
--	unsigned long flags;
-+	unsigned long lock_flags;
- 	bool ret;
- 
--	spin_lock_irqsave(&kbdev->hwaccess_lock, flags);
--	ret = kbase_prepare_to_reset_gpu_locked(kbdev);
--	spin_unlock_irqrestore(&kbdev->hwaccess_lock, flags);
-+	spin_lock_irqsave(&kbdev->hwaccess_lock, lock_flags);
-+	ret = kbase_prepare_to_reset_gpu_locked(kbdev, flags);
-+	spin_unlock_irqrestore(&kbdev->hwaccess_lock, lock_flags);
- 
- 	return ret;
- }
-@@ -1321,7 +1431,8 @@ void kbase_reset_gpu(struct kbase_device *kbdev)
- 	KBASE_DEBUG_ASSERT(kbdev);
- 
- 	/* Note this is an assert/atomic_set because it is a software issue for
--	 * a race to be occuring here */
-+	 * a race to be occurring here
-+	 */
- 	KBASE_DEBUG_ASSERT(atomic_read(&kbdev->hwaccess.backend.reset_gpu) ==
- 						KBASE_RESET_GPU_PREPARED);
- 	atomic_set(&kbdev->hwaccess.backend.reset_gpu,
-@@ -1344,7 +1455,8 @@ void kbase_reset_gpu_locked(struct kbase_device *kbdev)
- 	KBASE_DEBUG_ASSERT(kbdev);
- 
- 	/* Note this is an assert/atomic_set because it is a software issue for
--	 * a race to be occuring here */
-+	 * a race to be occurring here
-+	 */
- 	KBASE_DEBUG_ASSERT(atomic_read(&kbdev->hwaccess.backend.reset_gpu) ==
- 						KBASE_RESET_GPU_PREPARED);
- 	atomic_set(&kbdev->hwaccess.backend.reset_gpu,
-@@ -1419,3 +1531,21 @@ void kbase_reset_gpu_term(struct kbase_device *kbdev)
- {
- 	destroy_workqueue(kbdev->hwaccess.backend.reset_workq);
- }
-+
-+static u64 kbasep_apply_limited_core_mask(const struct kbase_device *kbdev,
-+				const u64 affinity, const u64 limited_core_mask)
-+{
-+	const u64 result = affinity & limited_core_mask;
-+
-+#ifdef CONFIG_MALI_DEBUG
-+	dev_dbg(kbdev->dev,
-+				"Limiting affinity due to BASE_JD_REQ_LIMITED_CORE_MASK from 0x%lx to 0x%lx (mask is 0x%lx)\n",
-+				(unsigned long int)affinity,
-+				(unsigned long int)result,
-+				(unsigned long int)limited_core_mask);
-+#else
-+	CSTD_UNUSED(kbdev);
-+#endif
-+
-+	return result;
-+}
-diff --git a/dvalin/kernel/drivers/gpu/arm/midgard/backend/gpu/mali_kbase_jm_internal.h b/dvalin/kernel/drivers/gpu/arm/midgard/backend/gpu/mali_kbase_jm_internal.h
-index 1419b59..1039e85 100644
---- a/dvalin/kernel/drivers/gpu/arm/midgard/backend/gpu/mali_kbase_jm_internal.h
-+++ b/dvalin/kernel/drivers/gpu/arm/midgard/backend/gpu/mali_kbase_jm_internal.h
-@@ -1,11 +1,12 @@
-+/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
- /*
-  *
-- * (C) COPYRIGHT 2011-2016, 2018-2020 ARM Limited. All rights reserved.
-+ * (C) COPYRIGHT 2011-2016, 2018-2021 ARM Limited. All rights reserved.
-  *
-  * This program is free software and is provided to you under the terms of the
-  * GNU General Public License version 2 as published by the Free Software
-  * Foundation, and any use by you of this program is subject to the terms
-- * of such GNU licence.
-+ * of such GNU license.
-  *
-  * This program is distributed in the hope that it will be useful,
-  * but WITHOUT ANY WARRANTY; without even the implied warranty of
-@@ -16,12 +17,8 @@
-  * along with this program; if not, you can access it online at
-  * http://www.gnu.org/licenses/gpl-2.0.html.
-  *
-- * SPDX-License-Identifier: GPL-2.0
-- *
-  */
- 
--
--
- /*
-  * Job Manager backend-specific low-level APIs.
-  */
-@@ -34,7 +31,7 @@
- #include <linux/atomic.h>
- 
- #include <backend/gpu/mali_kbase_jm_rb.h>
--#include <backend/gpu/mali_kbase_device_internal.h>
-+#include <device/mali_kbase_device.h>
- 
- /**
-  * kbase_job_submit_nolock() - Submit a job to a certain job-slot
-@@ -62,7 +59,7 @@ void kbase_job_submit_nolock(struct kbase_device *kbdev,
- void kbase_job_done_slot(struct kbase_device *kbdev, int s, u32 completion_code,
- 					u64 job_tail, ktime_t *end_timestamp);
- 
--#ifdef CONFIG_GPU_TRACEPOINTS
-+#if IS_ENABLED(CONFIG_GPU_TRACEPOINTS)
- static inline char *kbasep_make_job_slot_string(int js, char *js_string,
- 						size_t js_size)
- {
-@@ -71,11 +68,13 @@ static inline char *kbasep_make_job_slot_string(int js, char *js_string,
- }
- #endif
- 
-+#if !MALI_USE_CSF
- static inline int kbasep_jm_is_js_free(struct kbase_device *kbdev, int js,
- 						struct kbase_context *kctx)
- {
- 	return !kbase_reg_read(kbdev, JOB_SLOT_REG(js, JS_COMMAND_NEXT));
- }
-+#endif
- 
- 
- /**
-@@ -94,6 +93,7 @@ void kbase_job_hw_submit(struct kbase_device *kbdev,
- 				struct kbase_jd_atom *katom,
- 				int js);
- 
-+#if !MALI_USE_CSF
- /**
-  * kbasep_job_slot_soft_or_hard_stop_do_action() - Perform a soft or hard stop
-  *						   on the specified atom
-@@ -112,6 +112,7 @@ void kbasep_job_slot_soft_or_hard_stop_do_action(struct kbase_device *kbdev,
- 					u32 action,
- 					base_jd_core_req core_reqs,
- 					struct kbase_jd_atom *target_katom);
-+#endif /* !MALI_USE_CSF */
- 
- /**
-  * kbase_backend_soft_hard_stop_slot() - Soft or hard stop jobs on a given job
-diff --git a/dvalin/kernel/drivers/gpu/arm/midgard/backend/gpu/mali_kbase_jm_rb.c b/dvalin/kernel/drivers/gpu/arm/midgard/backend/gpu/mali_kbase_jm_rb.c
-index 4e4ed05..8ee897f 100755
---- a/dvalin/kernel/drivers/gpu/arm/midgard/backend/gpu/mali_kbase_jm_rb.c
-+++ b/dvalin/kernel/drivers/gpu/arm/midgard/backend/gpu/mali_kbase_jm_rb.c
-@@ -1,11 +1,12 @@
-+// SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note
- /*
-  *
-- * (C) COPYRIGHT 2014-2020 ARM Limited. All rights reserved.
-+ * (C) COPYRIGHT 2014-2021 ARM Limited. All rights reserved.
-  *
-  * This program is free software and is provided to you under the terms of the
-  * GNU General Public License version 2 as published by the Free Software
-  * Foundation, and any use by you of this program is subject to the terms
-- * of such GNU licence.
-+ * of such GNU license.
-  *
-  * This program is distributed in the hope that it will be useful,
-  * but WITHOUT ANY WARRANTY; without even the implied warranty of
-@@ -16,11 +17,8 @@
-  * along with this program; if not, you can access it online at
-  * http://www.gnu.org/licenses/gpl-2.0.html.
-  *
-- * SPDX-License-Identifier: GPL-2.0
-- *
-  */
- 
--
- /*
-  * Register-based HW access backend specific APIs
-  */
-@@ -33,16 +31,19 @@
- #include <tl/mali_kbase_tracepoints.h>
- #include <mali_kbase_hwcnt_context.h>
- #include <mali_kbase_reset_gpu.h>
-+#include <mali_kbase_kinstr_jm.h>
- #include <backend/gpu/mali_kbase_cache_policy_backend.h>
--#include <backend/gpu/mali_kbase_device_internal.h>
-+#include <device/mali_kbase_device.h>
- #include <backend/gpu/mali_kbase_jm_internal.h>
- #include <backend/gpu/mali_kbase_pm_internal.h>
- 
- /* Return whether the specified ringbuffer is empty. HW access lock must be
-- * held */
-+ * held
-+ */
- #define SLOT_RB_EMPTY(rb)   (rb->write_idx == rb->read_idx)
- /* Return number of atoms currently in the specified ringbuffer. HW access lock
-- * must be held */
-+ * must be held
-+ */
- #define SLOT_RB_ENTRIES(rb) (int)(s8)(rb->write_idx - rb->read_idx)
- 
- static void kbase_gpu_release_atom(struct kbase_device *kbdev,
-@@ -253,6 +254,8 @@ static bool kbase_gpu_check_secure_atoms(struct kbase_device *kbdev,
- 
- int kbase_backend_slot_free(struct kbase_device *kbdev, int js)
- {
-+	lockdep_assert_held(&kbdev->hwaccess_lock);
-+
- 	if (atomic_read(&kbdev->hwaccess.backend.reset_gpu) !=
- 						KBASE_RESET_GPU_NOT_PENDING) {
- 		/* The GPU is being reset - so prevent submission */
-@@ -278,15 +281,19 @@ static void kbase_gpu_release_atom(struct kbase_device *kbdev,
- 		break;
- 
- 	case KBASE_ATOM_GPU_RB_SUBMITTED:
-+		kbase_kinstr_jm_atom_hw_release(katom);
- 		/* Inform power management at start/finish of atom so it can
- 		 * update its GPU utilisation metrics. Mark atom as not
--		 * submitted beforehand. */
-+		 * submitted beforehand.
-+		 */
- 		katom->gpu_rb_state = KBASE_ATOM_GPU_RB_READY;
- 		kbase_pm_metrics_update(kbdev, end_timestamp);
- 
-+		/* Inform platform at start/finish of atom */
-+		kbasep_platform_event_atom_complete(katom);
-+
- 		if (katom->core_req & BASE_JD_REQ_PERMON)
- 			kbase_pm_release_gpu_cycle_counter_nolock(kbdev);
--		/* ***FALLTHROUGH: TRANSITION TO LOWER STATE*** */
- 
- 		KBASE_TLSTREAM_TL_NRET_ATOM_LPU(kbdev, katom,
- 			&kbdev->gpu_props.props.raw_props.js_features
-@@ -296,6 +303,8 @@ static void kbase_gpu_release_atom(struct kbase_device *kbdev,
- 			&kbdev->gpu_props.props.raw_props.js_features
- 				[katom->slot_nr]);
- 
-+		/* ***FALLTHROUGH: TRANSITION TO LOWER STATE*** */
-+
- 	case KBASE_ATOM_GPU_RB_READY:
- 		/* ***FALLTHROUGH: TRANSITION TO LOWER STATE*** */
- 
-@@ -540,7 +549,8 @@ static int kbase_jm_enter_protected_mode(struct kbase_device *kbdev,
- 		KBASE_TLSTREAM_AUX_PROTECTED_ENTER_START(kbdev, kbdev);
- 		/* The checks in KBASE_ATOM_GPU_RB_WAITING_PROTECTED_MODE_PREV
- 		 * should ensure that we are not already transitiong, and that
--		 * there are no atoms currently on the GPU. */
-+		 * there are no atoms currently on the GPU.
-+		 */
- 		WARN_ON(kbdev->protected_mode_transition);
- 		WARN_ON(kbase_gpu_atoms_submitted_any(kbdev));
- 		/* If hwcnt is disabled, it means we didn't clean up correctly
-@@ -566,19 +576,15 @@ static int kbase_jm_enter_protected_mode(struct kbase_device *kbdev,
- 
- 		/* We couldn't disable atomically, so kick off a worker */
- 		if (!kbdev->protected_mode_hwcnt_disabled) {
--#if KERNEL_VERSION(3, 16, 0) > LINUX_VERSION_CODE
--			queue_work(system_wq,
--				&kbdev->protected_mode_hwcnt_disable_work);
--#else
--			queue_work(system_highpri_wq,
-+			kbase_hwcnt_context_queue_work(
-+				kbdev->hwcnt_gpu_ctx,
- 				&kbdev->protected_mode_hwcnt_disable_work);
--#endif
- 			return -EAGAIN;
- 		}
- 
--		/* Once reaching this point GPU must be
--		 * switched to protected mode or hwcnt
--		 * re-enabled. */
-+		/* Once reaching this point GPU must be switched to protected
-+		 * mode or hwcnt re-enabled.
-+		 */
- 
- 		if (kbase_pm_protected_entry_override_enable(kbdev))
- 			return -EAGAIN;
-@@ -618,7 +624,7 @@ static int kbase_jm_enter_protected_mode(struct kbase_device *kbdev,
- 						KBASE_PM_CORE_L2) ||
- 				kbase_pm_get_trans_cores(kbdev,
- 						KBASE_PM_CORE_L2) ||
--				kbase_is_gpu_lost(kbdev)) {
-+				kbase_is_gpu_removed(kbdev)) {
- 				/*
- 				 * The L2 is still powered, wait for all
- 				 * the users to finish with it before doing
-@@ -718,7 +724,8 @@ static int kbase_jm_exit_protected_mode(struct kbase_device *kbdev,
- 		KBASE_TLSTREAM_AUX_PROTECTED_LEAVE_START(kbdev, kbdev);
- 		/* The checks in KBASE_ATOM_GPU_RB_WAITING_PROTECTED_MODE_PREV
- 		 * should ensure that we are not already transitiong, and that
--		 * there are no atoms currently on the GPU. */
-+		 * there are no atoms currently on the GPU.
-+		 */
- 		WARN_ON(kbdev->protected_mode_transition);
- 		WARN_ON(kbase_gpu_atoms_submitted_any(kbdev));
- 
-@@ -764,8 +771,8 @@ static int kbase_jm_exit_protected_mode(struct kbase_device *kbdev,
- 			katom[idx]->event_code = BASE_JD_EVENT_JOB_INVALID;
- 			kbase_gpu_mark_atom_for_return(kbdev, katom[idx]);
- 			/* Only return if head atom or previous atom
--			 * already removed - as atoms must be returned
--			 * in order */
-+			 * already removed - as atoms must be returned in order
-+			 */
- 			if (idx == 0 || katom[0]->gpu_rb_state ==
- 					KBASE_ATOM_GPU_RB_NOT_IN_SLOT_RB) {
- 				kbase_gpu_dequeue_atom(kbdev, js, NULL);
-@@ -811,7 +818,8 @@ void kbase_backend_slot_update(struct kbase_device *kbdev)
- 	lockdep_assert_held(&kbdev->hwaccess_lock);
- 
- #ifdef CONFIG_MALI_ARBITER_SUPPORT
--	if (kbase_reset_gpu_is_active(kbdev) || kbase_is_gpu_lost(kbdev))
-+	if (kbase_reset_gpu_is_active(kbdev) ||
-+			kbase_is_gpu_removed(kbdev))
- #else
- 	if (kbase_reset_gpu_is_active(kbdev))
- #endif
-@@ -843,7 +851,7 @@ void kbase_backend_slot_update(struct kbase_device *kbdev)
- 					break;
- 
- 				katom[idx]->gpu_rb_state =
--				KBASE_ATOM_GPU_RB_WAITING_PROTECTED_MODE_PREV;
-+					KBASE_ATOM_GPU_RB_WAITING_PROTECTED_MODE_PREV;
- 
- 				/* ***TRANSITION TO HIGHER STATE*** */
- 				/* fallthrough */
-@@ -907,12 +915,14 @@ void kbase_backend_slot_update(struct kbase_device *kbdev)
- 					kbase_gpu_mark_atom_for_return(kbdev,
- 							katom[idx]);
- 					/* Set EVENT_DONE so this atom will be
--					   completed, not unpulled. */
-+					 * completed, not unpulled.
-+					 */
- 					katom[idx]->event_code =
- 						BASE_JD_EVENT_DONE;
- 					/* Only return if head atom or previous
- 					 * atom already removed - as atoms must
--					 * be returned in order. */
-+					 * be returned in order.
-+					 */
- 					if (idx == 0 ||	katom[0]->gpu_rb_state ==
- 							KBASE_ATOM_GPU_RB_NOT_IN_SLOT_RB) {
- 						kbase_gpu_dequeue_atom(kbdev, js, NULL);
-@@ -943,7 +953,8 @@ void kbase_backend_slot_update(struct kbase_device *kbdev)
- 
- 				if (idx == 1) {
- 					/* Only submit if head atom or previous
--					 * atom already submitted */
-+					 * atom already submitted
-+					 */
- 					if ((katom[0]->gpu_rb_state !=
- 						KBASE_ATOM_GPU_RB_SUBMITTED &&
- 						katom[0]->gpu_rb_state !=
-@@ -959,7 +970,8 @@ void kbase_backend_slot_update(struct kbase_device *kbdev)
- 				}
- 
- 				/* If inter-slot serialization in use then don't
--				 * submit atom if any other slots are in use */
-+				 * submit atom if any other slots are in use
-+				 */
- 				if ((kbdev->serialize_jobs &
- 						KBASE_SERIALIZE_INTER_SLOT) &&
- 						other_slots_busy(kbdev, js))
-@@ -971,31 +983,37 @@ void kbase_backend_slot_update(struct kbase_device *kbdev)
- 					break;
- #endif
- 				/* Check if this job needs the cycle counter
--				 * enabled before submission */
-+				 * enabled before submission
-+				 */
- 				if (katom[idx]->core_req & BASE_JD_REQ_PERMON)
- 					kbase_pm_request_gpu_cycle_counter_l2_is_on(
- 									kbdev);
- 
- 				kbase_job_hw_submit(kbdev, katom[idx], js);
- 				katom[idx]->gpu_rb_state =
--						KBASE_ATOM_GPU_RB_SUBMITTED;
-+					KBASE_ATOM_GPU_RB_SUBMITTED;
-+
-+				/* ***TRANSITION TO HIGHER STATE*** */
-+				/* fallthrough */
-+			case KBASE_ATOM_GPU_RB_SUBMITTED:
- 
- 				/* Inform power management at start/finish of
- 				 * atom so it can update its GPU utilisation
--				 * metrics. */
-+				 * metrics.
-+				 */
- 				kbase_pm_metrics_update(kbdev,
- 						&katom[idx]->start_timestamp);
- 
--				/* ***TRANSITION TO HIGHER STATE*** */
--				/* fallthrough */
--			case KBASE_ATOM_GPU_RB_SUBMITTED:
--				/* Atom submitted to HW, nothing else to do */
-+				/* Inform platform at start/finish of atom */
-+				kbasep_platform_event_atom_submit(katom[idx]);
-+
- 				break;
- 
- 			case KBASE_ATOM_GPU_RB_RETURN_TO_JS:
- 				/* Only return if head atom or previous atom
- 				 * already removed - as atoms must be returned
--				 * in order */
-+				 * in order
-+				 */
- 				if (idx == 0 || katom[0]->gpu_rb_state ==
- 					KBASE_ATOM_GPU_RB_NOT_IN_SLOT_RB) {
- 					kbase_gpu_dequeue_atom(kbdev, js, NULL);
-@@ -1013,7 +1031,7 @@ void kbase_backend_run_atom(struct kbase_device *kbdev,
- 				struct kbase_jd_atom *katom)
- {
- 	lockdep_assert_held(&kbdev->hwaccess_lock);
--	dev_dbg(kbdev->dev, "Backend running atom %p\n", (void *)katom);
-+	dev_dbg(kbdev->dev, "Backend running atom %pK\n", (void *)katom);
- 
- 	kbase_gpu_enqueue_atom(kbdev, katom);
- 	kbase_backend_slot_update(kbdev);
-@@ -1074,7 +1092,7 @@ void kbase_gpu_complete_hw(struct kbase_device *kbdev, int js,
- 	struct kbase_context *kctx = katom->kctx;
- 
- 	dev_dbg(kbdev->dev,
--		"Atom %p completed on hw with code 0x%x and job_tail 0x%llx (s:%d)\n",
-+		"Atom %pK completed on hw with code 0x%x and job_tail 0x%llx (s:%d)\n",
- 		(void *)katom, completion_code, job_tail, js);
- 
- 	lockdep_assert_held(&kbdev->hwaccess_lock);
-@@ -1098,7 +1116,8 @@ void kbase_gpu_complete_hw(struct kbase_device *kbdev, int js,
- 		 * BASE_JD_REQ_SKIP_CACHE_END is set, the GPU cache is not
- 		 * flushed. To prevent future evictions causing possible memory
- 		 * corruption we need to flush the cache manually before any
--		 * affected memory gets reused. */
-+		 * affected memory gets reused.
-+		 */
- 		katom->need_cache_flush_cores_retained = true;
- 	}
- 
-@@ -1181,7 +1200,8 @@ void kbase_gpu_complete_hw(struct kbase_device *kbdev, int js,
- 					katom_idx1->gpu_rb_state !=
- 					KBASE_ATOM_GPU_RB_SUBMITTED) {
- 				/* Can not dequeue this atom yet - will be
--				 * dequeued when atom at idx0 completes */
-+				 * dequeued when atom at idx0 completes
-+				 */
- 				katom_idx1->event_code = BASE_JD_EVENT_STOPPED;
- 				kbase_gpu_mark_atom_for_return(kbdev,
- 								katom_idx1);
-@@ -1194,7 +1214,7 @@ void kbase_gpu_complete_hw(struct kbase_device *kbdev, int js,
- 	if (job_tail != 0 && job_tail != katom->jc) {
- 		/* Some of the job has been executed */
- 		dev_dbg(kbdev->dev,
--			"Update job chain address of atom %p to resume from 0x%llx\n",
-+			"Update job chain address of atom %pK to resume from 0x%llx\n",
- 			(void *)katom, job_tail);
- 
- 		katom->jc = job_tail;
-@@ -1214,7 +1234,7 @@ void kbase_gpu_complete_hw(struct kbase_device *kbdev, int js,
- 	 * - Schedule out the parent context if necessary, and schedule a new
- 	 *   one in.
- 	 */
--#ifdef CONFIG_GPU_TRACEPOINTS
-+#if IS_ENABLED(CONFIG_GPU_TRACEPOINTS)
- 	{
- 		/* The atom in the HEAD */
- 		struct kbase_jd_atom *next_katom = kbase_gpu_inspect(kbdev, js,
-@@ -1255,7 +1275,7 @@ void kbase_gpu_complete_hw(struct kbase_device *kbdev, int js,
- 
- 	if (katom) {
- 		dev_dbg(kbdev->dev,
--			"Cross-slot dependency %p has become runnable.\n",
-+			"Cross-slot dependency %pK has become runnable.\n",
- 			(void *)katom);
- 
- 		/* Check if there are lower priority jobs to soft stop */
-@@ -1268,7 +1288,8 @@ void kbase_gpu_complete_hw(struct kbase_device *kbdev, int js,
- 	kbase_pm_update_state(kbdev);
- 
- 	/* Job completion may have unblocked other atoms. Try to update all job
--	 * slots */
-+	 * slots
-+	 */
- 	kbase_backend_slot_update(kbdev);
- }
- 
-@@ -1319,7 +1340,8 @@ void kbase_backend_reset(struct kbase_device *kbdev, ktime_t *end_timestamp)
- 				katom->protected_state.exit = KBASE_ATOM_EXIT_PROTECTED_CHECK;
- 				/* As the atom was not removed, increment the
- 				 * index so that we read the correct atom in the
--				 * next iteration. */
-+				 * next iteration.
-+				 */
- 				atom_idx++;
- 				continue;
- 			}
-@@ -1422,7 +1444,8 @@ bool kbase_backend_soft_hard_stop_slot(struct kbase_device *kbdev,
- 		katom_idx0_valid = (katom_idx0 == katom);
- 		/* If idx0 is to be removed and idx1 is on the same context,
- 		 * then idx1 must also be removed otherwise the atoms might be
--		 * returned out of order */
-+		 * returned out of order
-+		 */
- 		if (katom_idx1)
- 			katom_idx1_valid = (katom_idx1 == katom) ||
- 						(katom_idx0_valid &&
-@@ -1469,7 +1492,8 @@ bool kbase_backend_soft_hard_stop_slot(struct kbase_device *kbdev,
- 				if (kbase_reg_read(kbdev, JOB_SLOT_REG(js,
- 						JS_COMMAND_NEXT)) == 0) {
- 					/* idx0 has already completed - stop
--					 * idx1 if needed*/
-+					 * idx1 if needed
-+					 */
- 					if (katom_idx1_valid) {
- 						kbase_gpu_stop_atom(kbdev, js,
- 								katom_idx1,
-@@ -1478,7 +1502,8 @@ bool kbase_backend_soft_hard_stop_slot(struct kbase_device *kbdev,
- 					}
- 				} else {
- 					/* idx1 is in NEXT registers - attempt
--					 * to remove */
-+					 * to remove
-+					 */
- 					kbase_reg_write(kbdev,
- 							JOB_SLOT_REG(js,
- 							JS_COMMAND_NEXT),
-@@ -1493,7 +1518,8 @@ bool kbase_backend_soft_hard_stop_slot(struct kbase_device *kbdev,
- 							JS_HEAD_NEXT_HI))
- 									!= 0) {
- 						/* idx1 removed successfully,
--						 * will be handled in IRQ */
-+						 * will be handled in IRQ
-+						 */
- 						kbase_gpu_remove_atom(kbdev,
- 								katom_idx1,
- 								action, true);
-@@ -1507,7 +1533,8 @@ bool kbase_backend_soft_hard_stop_slot(struct kbase_device *kbdev,
- 						ret = true;
- 					} else if (katom_idx1_valid) {
- 						/* idx0 has already completed,
--						 * stop idx1 if needed */
-+						 * stop idx1 if needed
-+						 */
- 						kbase_gpu_stop_atom(kbdev, js,
- 								katom_idx1,
- 								action);
-@@ -1526,7 +1553,8 @@ bool kbase_backend_soft_hard_stop_slot(struct kbase_device *kbdev,
- 				 * flow was also interrupted, and this function
- 				 * might not enter disjoint state e.g. if we
- 				 * don't actually do a hard stop on the head
--				 * atom */
-+				 * atom
-+				 */
- 				kbase_gpu_stop_atom(kbdev, js, katom_idx0,
- 									action);
- 				ret = true;
-@@ -1554,7 +1582,8 @@ bool kbase_backend_soft_hard_stop_slot(struct kbase_device *kbdev,
- 				ret = true;
- 			} else {
- 				/* idx1 is in NEXT registers - attempt to
--				 * remove */
-+				 * remove
-+				 */
- 				kbase_reg_write(kbdev, JOB_SLOT_REG(js,
- 							JS_COMMAND_NEXT),
- 							JS_COMMAND_NOP);
-@@ -1564,13 +1593,15 @@ bool kbase_backend_soft_hard_stop_slot(struct kbase_device *kbdev,
- 				    kbase_reg_read(kbdev, JOB_SLOT_REG(js,
- 						JS_HEAD_NEXT_HI)) != 0) {
- 					/* idx1 removed successfully, will be
--					 * handled in IRQ once idx0 completes */
-+					 * handled in IRQ once idx0 completes
-+					 */
- 					kbase_gpu_remove_atom(kbdev, katom_idx1,
- 									action,
- 									false);
- 				} else {
- 					/* idx0 has already completed - stop
--					 * idx1 */
-+					 * idx1
-+					 */
- 					kbase_gpu_stop_atom(kbdev, js,
- 								katom_idx1,
- 								action);
-@@ -1644,7 +1675,7 @@ void kbase_gpu_dump_slots(struct kbase_device *kbdev)
- 
- 			if (katom)
- 				dev_info(kbdev->dev,
--				"  js%d idx%d : katom=%p gpu_rb_state=%d\n",
-+				"  js%d idx%d : katom=%pK gpu_rb_state=%d\n",
- 				js, idx, katom, katom->gpu_rb_state);
- 			else
- 				dev_info(kbdev->dev, "  js%d idx%d : empty\n",
-diff --git a/dvalin/kernel/drivers/gpu/arm/midgard/backend/gpu/mali_kbase_jm_rb.h b/dvalin/kernel/drivers/gpu/arm/midgard/backend/gpu/mali_kbase_jm_rb.h
-index c3b9f2d..d3ff203 100644
---- a/dvalin/kernel/drivers/gpu/arm/midgard/backend/gpu/mali_kbase_jm_rb.h
-+++ b/dvalin/kernel/drivers/gpu/arm/midgard/backend/gpu/mali_kbase_jm_rb.h
-@@ -1,11 +1,12 @@
-+/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
- /*
-  *
-- * (C) COPYRIGHT 2014-2018 ARM Limited. All rights reserved.
-+ * (C) COPYRIGHT 2014-2018, 2020-2021 ARM Limited. All rights reserved.
-  *
-  * This program is free software and is provided to you under the terms of the
-  * GNU General Public License version 2 as published by the Free Software
-  * Foundation, and any use by you of this program is subject to the terms
-- * of such GNU licence.
-+ * of such GNU license.
-  *
-  * This program is distributed in the hope that it will be useful,
-  * but WITHOUT ANY WARRANTY; without even the implied warranty of
-@@ -16,11 +17,8 @@
-  * along with this program; if not, you can access it online at
-  * http://www.gnu.org/licenses/gpl-2.0.html.
-  *
-- * SPDX-License-Identifier: GPL-2.0
-- *
-  */
- 
--
- /*
-  * Register-based HW access backend specific APIs
-  */
-diff --git a/dvalin/kernel/drivers/gpu/arm/midgard/backend/gpu/mali_kbase_js_backend.c b/dvalin/kernel/drivers/gpu/arm/midgard/backend/gpu/mali_kbase_js_backend.c
-index fcc0437..02d7cdb 100644
---- a/dvalin/kernel/drivers/gpu/arm/midgard/backend/gpu/mali_kbase_js_backend.c
-+++ b/dvalin/kernel/drivers/gpu/arm/midgard/backend/gpu/mali_kbase_js_backend.c
-@@ -1,11 +1,12 @@
-+// SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note
- /*
-  *
-- * (C) COPYRIGHT 2014-2020 ARM Limited. All rights reserved.
-+ * (C) COPYRIGHT 2014-2021 ARM Limited. All rights reserved.
-  *
-  * This program is free software and is provided to you under the terms of the
-  * GNU General Public License version 2 as published by the Free Software
-  * Foundation, and any use by you of this program is subject to the terms
-- * of such GNU licence.
-+ * of such GNU license.
-  *
-  * This program is distributed in the hope that it will be useful,
-  * but WITHOUT ANY WARRANTY; without even the implied warranty of
-@@ -16,11 +17,8 @@
-  * along with this program; if not, you can access it online at
-  * http://www.gnu.org/licenses/gpl-2.0.html.
-  *
-- * SPDX-License-Identifier: GPL-2.0
-- *
-  */
- 
--
- /*
-  * Register-based HW access backend specific job scheduler APIs
-  */
-@@ -31,13 +29,14 @@
- #include <backend/gpu/mali_kbase_jm_internal.h>
- #include <backend/gpu/mali_kbase_js_internal.h>
- 
-+#if !MALI_USE_CSF
- /*
-  * Hold the runpool_mutex for this
-  */
- static inline bool timer_callback_should_run(struct kbase_device *kbdev)
- {
- 	struct kbase_backend_data *backend = &kbdev->hwaccess.backend;
--	s8 nr_running_ctxs;
-+	int nr_running_ctxs;
- 
- 	lockdep_assert_held(&kbdev->js_data.runpool_mutex);
- 
-@@ -47,7 +46,8 @@ static inline bool timer_callback_should_run(struct kbase_device *kbdev)
- 
- 	/* nr_contexts_pullable is updated with the runpool_mutex. However, the
- 	 * locking in the caller gives us a barrier that ensures
--	 * nr_contexts_pullable is up-to-date for reading */
-+	 * nr_contexts_pullable is up-to-date for reading
-+	 */
- 	nr_running_ctxs = atomic_read(&kbdev->js_data.nr_contexts_runnable);
- 
- #ifdef CONFIG_MALI_DEBUG
-@@ -69,10 +69,10 @@ static inline bool timer_callback_should_run(struct kbase_device *kbdev)
- 		 * don't check KBASEP_JS_CTX_ATTR_NON_COMPUTE).
- 		 */
- 		{
--			s8 nr_compute_ctxs =
-+			int nr_compute_ctxs =
- 				kbasep_js_ctx_attr_count_on_runpool(kbdev,
- 						KBASEP_JS_CTX_ATTR_COMPUTE);
--			s8 nr_noncompute_ctxs = nr_running_ctxs -
-+			int nr_noncompute_ctxs = nr_running_ctxs -
- 							nr_compute_ctxs;
- 
- 			return (bool) (nr_compute_ctxs >= 2 ||
-@@ -113,7 +113,8 @@ static enum hrtimer_restart timer_callback(struct hrtimer *timer)
- 
- 		if (atom != NULL) {
- 			/* The current version of the model doesn't support
--			 * Soft-Stop */
-+			 * Soft-Stop
-+			 */
- 			if (!kbase_hw_has_issue(kbdev, BASE_HW_ISSUE_5736)) {
- 				u32 ticks = atom->ticks++;
- 
-@@ -141,7 +142,8 @@ static enum hrtimer_restart timer_callback(struct hrtimer *timer)
- 				 * new soft_stop timeout. This ensures that
- 				 * atoms do not miss any of the timeouts due to
- 				 * races between this worker and the thread
--				 * changing the timeouts. */
-+				 * changing the timeouts.
-+				 */
- 				if (backend->timeouts_updated &&
- 						ticks > soft_stop_ticks)
- 					ticks = atom->ticks = soft_stop_ticks;
-@@ -171,10 +173,11 @@ static enum hrtimer_restart timer_callback(struct hrtimer *timer)
- 					 *
- 					 * Similarly, if it's about to be
- 					 * decreased, the last job from another
--					 * context has already finished, so it's
--					 * not too bad that we observe the older
--					 * value and register a disjoint event
--					 * when we try soft-stopping */
-+					 * context has already finished, so
-+					 * it's not too bad that we observe the
-+					 * older value and register a disjoint
-+					 * event when we try soft-stopping
-+					 */
- 					if (js_devdata->nr_user_contexts_running
- 							>= disjoint_threshold)
- 						softstop_flags |=
-@@ -252,9 +255,9 @@ static enum hrtimer_restart timer_callback(struct hrtimer *timer)
- 		}
- 	}
- 	if (reset_needed) {
--		dev_err(kbdev->dev, "JS: Job has been on the GPU for too long (JS_RESET_TICKS_SS/DUMPING timeout hit). Issueing GPU soft-reset to resolve.");
-+		dev_err(kbdev->dev, "JS: Job has been on the GPU for too long (JS_RESET_TICKS_SS/DUMPING timeout hit). Issuing GPU soft-reset to resolve.");
- 
--		if (kbase_prepare_to_reset_gpu_locked(kbdev))
-+		if (kbase_prepare_to_reset_gpu_locked(kbdev, RESET_FLAGS_NONE))
- 			kbase_reset_gpu_locked(kbdev);
- 	}
- 	/* the timer is re-issued if there is contexts in the run-pool */
-@@ -270,9 +273,11 @@ static enum hrtimer_restart timer_callback(struct hrtimer *timer)
- 
- 	return HRTIMER_NORESTART;
- }
-+#endif /* !MALI_USE_CSF */
- 
- void kbase_backend_ctx_count_changed(struct kbase_device *kbdev)
- {
-+#if !MALI_USE_CSF
- 	struct kbasep_js_device_data *js_devdata = &kbdev->js_data;
- 	struct kbase_backend_data *backend = &kbdev->hwaccess.backend;
- 	unsigned long flags;
-@@ -284,11 +289,12 @@ void kbase_backend_ctx_count_changed(struct kbase_device *kbdev)
- 		spin_lock_irqsave(&kbdev->hwaccess_lock, flags);
- 		backend->timer_running = false;
- 		spin_unlock_irqrestore(&kbdev->hwaccess_lock, flags);
--		/* From now on, return value of timer_callback_should_run() will
--		 * also cause the timer to not requeue itself. Its return value
--		 * cannot change, because it depends on variables updated with
--		 * the runpool_mutex held, which the caller of this must also
--		 * hold */
-+		/* From now on, return value of timer_callback_should_run()
-+		 * will also cause the timer to not requeue itself. Its return
-+		 * value cannot change, because it depends on variables updated
-+		 * with the runpool_mutex held, which the caller of this must
-+		 * also hold
-+		 */
- 		hrtimer_cancel(&backend->scheduling_timer);
- 	}
- 
-@@ -303,25 +309,36 @@ void kbase_backend_ctx_count_changed(struct kbase_device *kbdev)
- 
- 		KBASE_KTRACE_ADD_JM(kbdev, JS_POLICY_TIMER_START, NULL, NULL, 0u, 0u);
- 	}
-+#else /* !MALI_USE_CSF */
-+	CSTD_UNUSED(kbdev);
-+#endif /* !MALI_USE_CSF */
- }
- 
- int kbase_backend_timer_init(struct kbase_device *kbdev)
- {
-+#if !MALI_USE_CSF
- 	struct kbase_backend_data *backend = &kbdev->hwaccess.backend;
- 
- 	hrtimer_init(&backend->scheduling_timer, CLOCK_MONOTONIC,
- 							HRTIMER_MODE_REL);
- 	backend->scheduling_timer.function = timer_callback;
- 	backend->timer_running = false;
-+#else /* !MALI_USE_CSF */
-+	CSTD_UNUSED(kbdev);
-+#endif /* !MALI_USE_CSF */
- 
- 	return 0;
- }
- 
- void kbase_backend_timer_term(struct kbase_device *kbdev)
- {
-+#if !MALI_USE_CSF
- 	struct kbase_backend_data *backend = &kbdev->hwaccess.backend;
- 
- 	hrtimer_cancel(&backend->scheduling_timer);
-+#else /* !MALI_USE_CSF */
-+	CSTD_UNUSED(kbdev);
-+#endif /* !MALI_USE_CSF */
- }
- 
- void kbase_backend_timer_suspend(struct kbase_device *kbdev)
-diff --git a/dvalin/kernel/drivers/gpu/arm/midgard/backend/gpu/mali_kbase_js_internal.h b/dvalin/kernel/drivers/gpu/arm/midgard/backend/gpu/mali_kbase_js_internal.h
-index 6576e55..5284288 100644
---- a/dvalin/kernel/drivers/gpu/arm/midgard/backend/gpu/mali_kbase_js_internal.h
-+++ b/dvalin/kernel/drivers/gpu/arm/midgard/backend/gpu/mali_kbase_js_internal.h
-@@ -1,11 +1,12 @@
-+/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
- /*
-  *
-- * (C) COPYRIGHT 2014-2015 ARM Limited. All rights reserved.
-+ * (C) COPYRIGHT 2014-2015, 2020-2021 ARM Limited. All rights reserved.
-  *
-  * This program is free software and is provided to you under the terms of the
-  * GNU General Public License version 2 as published by the Free Software
-  * Foundation, and any use by you of this program is subject to the terms
-- * of such GNU licence.
-+ * of such GNU license.
-  *
-  * This program is distributed in the hope that it will be useful,
-  * but WITHOUT ANY WARRANTY; without even the implied warranty of
-@@ -16,11 +17,8 @@
-  * along with this program; if not, you can access it online at
-  * http://www.gnu.org/licenses/gpl-2.0.html.
-  *
-- * SPDX-License-Identifier: GPL-2.0
-- *
-  */
- 
--
- /*
-  * Register-based HW access backend specific job scheduler APIs
-  */
-diff --git a/dvalin/kernel/drivers/gpu/arm/midgard/backend/gpu/mali_kbase_l2_mmu_config.c b/dvalin/kernel/drivers/gpu/arm/midgard/backend/gpu/mali_kbase_l2_mmu_config.c
-index e67d12b..7131546 100644
---- a/dvalin/kernel/drivers/gpu/arm/midgard/backend/gpu/mali_kbase_l2_mmu_config.c
-+++ b/dvalin/kernel/drivers/gpu/arm/midgard/backend/gpu/mali_kbase_l2_mmu_config.c
-@@ -1,12 +1,12 @@
--// SPDX-License-Identifier: GPL-2.0
-+// SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note
- /*
-  *
-- * (C) COPYRIGHT 2019-2020 ARM Limited. All rights reserved.
-+ * (C) COPYRIGHT 2019-2021 ARM Limited. All rights reserved.
-  *
-  * This program is free software and is provided to you under the terms of the
-  * GNU General Public License version 2 as published by the Free Software
-  * Foundation, and any use by you of this program is subject to the terms
-- * of such GNU licence.
-+ * of such GNU license.
-  *
-  * This program is distributed in the hope that it will be useful,
-  * but WITHOUT ANY WARRANTY; without even the implied warranty of
-@@ -17,14 +17,12 @@
-  * along with this program; if not, you can access it online at
-  * http://www.gnu.org/licenses/gpl-2.0.html.
-  *
-- * SPDX-License-Identifier: GPL-2.0
-- *
-  */
- 
- #include <mali_kbase.h>
- #include <mali_kbase_bits.h>
- #include <mali_kbase_config_defaults.h>
--#include <backend/gpu/mali_kbase_device_internal.h>
-+#include <device/mali_kbase_device.h>
- #include "mali_kbase_l2_mmu_config.h"
- 
- /**
-@@ -56,23 +54,34 @@ struct l2_mmu_config_limit {
- /*
-  * Zero represents no limit
-  *
-- * For LBEX TBEX TTRX and TNAX:
-+ * For LBEX TBEX TBAX TTRX and TNAX:
-  *   The value represents the number of outstanding reads (6 bits) or writes (5 bits)
-  *
-  * For all other GPUS it is a fraction see: mali_kbase_config_defaults.h
-  */
- static const struct l2_mmu_config_limit limits[] = {
--	 /* GPU                       read                  write            */
--	 {GPU_ID2_PRODUCT_LBEX, {0, GENMASK(10, 5), 5}, {0, GENMASK(16, 12), 12} },
--	 {GPU_ID2_PRODUCT_TBEX, {0, GENMASK(10, 5), 5}, {0, GENMASK(16, 12), 12} },
--	 {GPU_ID2_PRODUCT_TTRX, {0, GENMASK(12, 7), 7}, {0, GENMASK(17, 13), 13} },
--	 {GPU_ID2_PRODUCT_TNAX, {0, GENMASK(12, 7), 7}, {0, GENMASK(17, 13), 13} },
--	 {GPU_ID2_PRODUCT_TGOX,
--	   {KBASE_3BIT_AID_32, GENMASK(14, 12), 12},
--	   {KBASE_3BIT_AID_32, GENMASK(17, 15), 15} },
--	 {GPU_ID2_PRODUCT_TNOX,
--	   {KBASE_3BIT_AID_32, GENMASK(14, 12), 12},
--	   {KBASE_3BIT_AID_32, GENMASK(17, 15), 15} },
-+	/* GPU, read, write */
-+	{GPU_ID2_PRODUCT_LBEX,
-+		{0, GENMASK(10, 5), 5},
-+		{0, GENMASK(16, 12), 12} },
-+	{GPU_ID2_PRODUCT_TBEX,
-+		{0, GENMASK(10, 5), 5},
-+		{0, GENMASK(16, 12), 12} },
-+	{GPU_ID2_PRODUCT_TBAX,
-+		{0, GENMASK(10, 5), 5},
-+		{0, GENMASK(16, 12), 12} },
-+	{GPU_ID2_PRODUCT_TTRX,
-+		{0, GENMASK(12, 7), 7},
-+		{0, GENMASK(17, 13), 13} },
-+	{GPU_ID2_PRODUCT_TNAX,
-+		{0, GENMASK(12, 7), 7},
-+		{0, GENMASK(17, 13), 13} },
-+	{GPU_ID2_PRODUCT_TGOX,
-+		{KBASE_3BIT_AID_32, GENMASK(14, 12), 12},
-+		{KBASE_3BIT_AID_32, GENMASK(17, 15), 15} },
-+	{GPU_ID2_PRODUCT_TNOX,
-+		{KBASE_3BIT_AID_32, GENMASK(14, 12), 12},
-+		{KBASE_3BIT_AID_32, GENMASK(17, 15), 15} },
- };
- 
- int kbase_set_mmu_quirks(struct kbase_device *kbdev)
-@@ -100,7 +109,7 @@ int kbase_set_mmu_quirks(struct kbase_device *kbdev)
- 
- 	mmu_config = kbase_reg_read(kbdev, GPU_CONTROL_REG(L2_MMU_CONFIG));
- 
--	if (kbase_is_gpu_lost(kbdev))
-+	if (kbase_is_gpu_removed(kbdev))
- 		return -EIO;
- 
- 	mmu_config &= ~(limit.read.mask | limit.write.mask);
-diff --git a/dvalin/kernel/drivers/gpu/arm/midgard/backend/gpu/mali_kbase_l2_mmu_config.h b/dvalin/kernel/drivers/gpu/arm/midgard/backend/gpu/mali_kbase_l2_mmu_config.h
-index 0c779ac..07014ad 100644
---- a/dvalin/kernel/drivers/gpu/arm/midgard/backend/gpu/mali_kbase_l2_mmu_config.h
-+++ b/dvalin/kernel/drivers/gpu/arm/midgard/backend/gpu/mali_kbase_l2_mmu_config.h
-@@ -1,31 +1,12 @@
-+/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
- /*
-  *
-- * (C) COPYRIGHT ARM Limited. All rights reserved.
-+ * (C) COPYRIGHT 2019-2021 ARM Limited. All rights reserved.
-  *
-  * This program is free software and is provided to you under the terms of the
-  * GNU General Public License version 2 as published by the Free Software
-  * Foundation, and any use by you of this program is subject to the terms
-- * of such GNU licence.
-- *
-- * This program is distributed in the hope that it will be useful,
-- * but WITHOUT ANY WARRANTY; without even the implied warranty of
-- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-- * GNU General Public License for more details.
-- *
-- * You should have received a copy of the GNU General Public License
-- * along with this program; if not, you can access it online at
-- * http://www.gnu.org/licenses/gpl-2.0.html.
-- *
-- * SPDX-License-Identifier: GPL-2.0
-- *
-- *//* SPDX-License-Identifier: GPL-2.0 */
--/*
-- * (C) COPYRIGHT 2019-2020 ARM Limited. All rights reserved.
-- *
-- * This program is free software and is provided to you under the terms of the
-- * GNU General Public License version 2 as published by the Free Software
-- * Foundation, and any use by you of this program is subject to the terms
-- * of such GNU licence.
-+ * of such GNU license.
-  *
-  * This program is distributed in the hope that it will be useful,
-  * but WITHOUT ANY WARRANTY; without even the implied warranty of
-diff --git a/dvalin/kernel/drivers/gpu/arm/midgard/backend/gpu/mali_kbase_pm_always_on.c b/dvalin/kernel/drivers/gpu/arm/midgard/backend/gpu/mali_kbase_pm_always_on.c
-index e33fe0b..077c234 100644
---- a/dvalin/kernel/drivers/gpu/arm/midgard/backend/gpu/mali_kbase_pm_always_on.c
-+++ b/dvalin/kernel/drivers/gpu/arm/midgard/backend/gpu/mali_kbase_pm_always_on.c
-@@ -1,11 +1,12 @@
-+// SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note
- /*
-  *
-- * (C) COPYRIGHT 2010-2015, 2018-2019 ARM Limited. All rights reserved.
-+ * (C) COPYRIGHT 2010-2015, 2018-2021 ARM Limited. All rights reserved.
-  *
-  * This program is free software and is provided to you under the terms of the
-  * GNU General Public License version 2 as published by the Free Software
-  * Foundation, and any use by you of this program is subject to the terms
-- * of such GNU licence.
-+ * of such GNU license.
-  *
-  * This program is distributed in the hope that it will be useful,
-  * but WITHOUT ANY WARRANTY; without even the implied warranty of
-@@ -16,12 +17,8 @@
-  * along with this program; if not, you can access it online at
-  * http://www.gnu.org/licenses/gpl-2.0.html.
-  *
-- * SPDX-License-Identifier: GPL-2.0
-- *
-  */
- 
--
--
- /*
-  * "Always on" power management policy
-  */
-@@ -61,7 +58,11 @@ const struct kbase_pm_policy kbase_pm_always_on_policy_ops = {
- 	always_on_term,			/* term */
- 	always_on_shaders_needed,	/* shaders_needed */
- 	always_on_get_core_active,	/* get_core_active */
-+	NULL,				/* handle_event */
- 	KBASE_PM_POLICY_ID_ALWAYS_ON,	/* id */
-+#if MALI_USE_CSF
-+	ALWAYS_ON_PM_SCHED_FLAGS,	/* pm_sched_flags */
-+#endif
- };
- 
- KBASE_EXPORT_TEST_API(kbase_pm_always_on_policy_ops);
-diff --git a/dvalin/kernel/drivers/gpu/arm/midgard/backend/gpu/mali_kbase_pm_always_on.h b/dvalin/kernel/drivers/gpu/arm/midgard/backend/gpu/mali_kbase_pm_always_on.h
-index e7927cf..98d35da 100644
---- a/dvalin/kernel/drivers/gpu/arm/midgard/backend/gpu/mali_kbase_pm_always_on.h
-+++ b/dvalin/kernel/drivers/gpu/arm/midgard/backend/gpu/mali_kbase_pm_always_on.h
-@@ -1,11 +1,12 @@
-+/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
- /*
-  *
-- * (C) COPYRIGHT 2011-2015,2018 ARM Limited. All rights reserved.
-+ * (C) COPYRIGHT 2011-2015, 2018, 2020-2021 ARM Limited. All rights reserved.
-  *
-  * This program is free software and is provided to you under the terms of the
-  * GNU General Public License version 2 as published by the Free Software
-  * Foundation, and any use by you of this program is subject to the terms
-- * of such GNU licence.
-+ * of such GNU license.
-  *
-  * This program is distributed in the hope that it will be useful,
-  * but WITHOUT ANY WARRANTY; without even the implied warranty of
-@@ -16,12 +17,8 @@
-  * along with this program; if not, you can access it online at
-  * http://www.gnu.org/licenses/gpl-2.0.html.
-  *
-- * SPDX-License-Identifier: GPL-2.0
-- *
-  */
- 
--
--
- /*
-  * "Always on" power management policy
-  */
-diff --git a/dvalin/kernel/drivers/gpu/arm/midgard/backend/gpu/mali_kbase_pm_backend.c b/dvalin/kernel/drivers/gpu/arm/midgard/backend/gpu/mali_kbase_pm_backend.c
-index 576c9f2..cc791df 100644
---- a/dvalin/kernel/drivers/gpu/arm/midgard/backend/gpu/mali_kbase_pm_backend.c
-+++ b/dvalin/kernel/drivers/gpu/arm/midgard/backend/gpu/mali_kbase_pm_backend.c
-@@ -1,11 +1,12 @@
-- /*
-+// SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note
-+/*
-  *
-- * (C) COPYRIGHT 2010-2020 ARM Limited. All rights reserved.
-+ * (C) COPYRIGHT 2010-2021 ARM Limited. All rights reserved.
-  *
-  * This program is free software and is provided to you under the terms of the
-  * GNU General Public License version 2 as published by the Free Software
-  * Foundation, and any use by you of this program is subject to the terms
-- * of such GNU licence.
-+ * of such GNU license.
-  *
-  * This program is distributed in the hope that it will be useful,
-  * but WITHOUT ANY WARRANTY; without even the implied warranty of
-@@ -16,11 +17,8 @@
-  * along with this program; if not, you can access it online at
-  * http://www.gnu.org/licenses/gpl-2.0.html.
-  *
-- * SPDX-License-Identifier: GPL-2.0
-- *
-  */
- 
--
- /*
-  * GPU backend implementation of base kernel power management APIs
-  */
-@@ -30,14 +28,16 @@
- #include <mali_kbase_config_defaults.h>
- 
- #include <mali_kbase_pm.h>
-+#if !MALI_USE_CSF
- #include <mali_kbase_hwaccess_jm.h>
- #include <backend/gpu/mali_kbase_js_internal.h>
- #include <backend/gpu/mali_kbase_jm_internal.h>
-+#endif /* !MALI_USE_CSF */
- #include <mali_kbase_hwcnt_context.h>
- #include <backend/gpu/mali_kbase_pm_internal.h>
- #include <backend/gpu/mali_kbase_devfreq.h>
- #include <mali_kbase_dummy_job_wa.h>
--#include <mali_kbase_irq_internal.h>
-+#include <backend/gpu/mali_kbase_irq_internal.h>
- 
- static void kbase_pm_gpu_poweroff_wait_wq(struct work_struct *data);
- static void kbase_pm_hwcnt_disable_worker(struct work_struct *data);
-@@ -106,6 +106,11 @@ void kbase_pm_register_access_enable(struct kbase_device *kbdev)
- 	if (callbacks)
- 		callbacks->power_on_callback(kbdev);
- 
-+#ifdef CONFIG_MALI_ARBITER_SUPPORT
-+	if (WARN_ON(kbase_pm_is_gpu_lost(kbdev)))
-+		dev_err(kbdev->dev, "Attempting to power on while GPU lost\n");
-+#endif
-+
- 	kbdev->pm.backend.gpu_powered = true;
- }
- 
-@@ -139,24 +144,35 @@ int kbase_hwaccess_pm_init(struct kbase_device *kbdev)
- 
- 	kbdev->pm.backend.ca_cores_enabled = ~0ull;
- 	kbdev->pm.backend.gpu_powered = false;
-+	kbdev->pm.backend.gpu_ready = false;
- 	kbdev->pm.suspending = false;
- #ifdef CONFIG_MALI_ARBITER_SUPPORT
--	kbdev->pm.gpu_lost = false;
-+	kbase_pm_set_gpu_lost(kbdev, false);
- #endif
- #ifdef CONFIG_MALI_DEBUG
- 	kbdev->pm.backend.driver_ready_for_irqs = false;
- #endif /* CONFIG_MALI_DEBUG */
- 	init_waitqueue_head(&kbdev->pm.backend.gpu_in_desired_state_wait);
- 
-+#if !MALI_USE_CSF
- 	/* Initialise the metrics subsystem */
- 	ret = kbasep_pm_metrics_init(kbdev);
- 	if (ret)
- 		return ret;
-+#else
-+	mutex_init(&kbdev->pm.backend.policy_change_lock);
-+	kbdev->pm.backend.policy_change_clamp_state_to_off = false;
-+	/* Due to dependency on kbase_ipa_control, the metrics subsystem can't
-+	 * be initialized here.
-+	 */
-+	CSTD_UNUSED(ret);
-+#endif
- 
- 	init_waitqueue_head(&kbdev->pm.backend.reset_done_wait);
- 	kbdev->pm.backend.reset_done = false;
- 
- 	init_waitqueue_head(&kbdev->pm.zero_active_count_wait);
-+	init_waitqueue_head(&kbdev->pm.resume_wait);
- 	kbdev->pm.active_count = 0;
- 
- 	spin_lock_init(&kbdev->pm.backend.gpu_cycle_counter_requests_lock);
-@@ -213,7 +229,9 @@ pm_state_machine_fail:
- 	kbase_pm_policy_term(kbdev);
- 	kbase_pm_ca_term(kbdev);
- workq_fail:
-+#if !MALI_USE_CSF
- 	kbasep_pm_metrics_term(kbdev);
-+#endif
- 	return -EINVAL;
- }
- 
-@@ -222,7 +240,8 @@ void kbase_pm_do_poweron(struct kbase_device *kbdev, bool is_resume)
- 	lockdep_assert_held(&kbdev->pm.lock);
- 
- 	/* Turn clocks and interrupts on - no-op if we haven't done a previous
--	 * kbase_pm_clock_off() */
-+	 * kbase_pm_clock_off()
-+	 */
- 	kbase_pm_clock_on(kbdev, is_resume);
- 
- 	if (!is_resume) {
-@@ -240,7 +259,8 @@ void kbase_pm_do_poweron(struct kbase_device *kbdev, bool is_resume)
- 	kbase_pm_update_cores_state(kbdev);
- 
- 	/* NOTE: We don't wait to reach the desired state, since running atoms
--	 * will wait for that state to be reached anyway */
-+	 * will wait for that state to be reached anyway
-+	 */
- }
- 
- static void kbase_pm_gpu_poweroff_wait_wq(struct work_struct *data)
-@@ -251,13 +271,20 @@ static void kbase_pm_gpu_poweroff_wait_wq(struct work_struct *data)
- 	struct kbase_pm_backend_data *backend = &pm->backend;
- 	unsigned long flags;
- 
-+#if !MALI_USE_CSF
- 	/* Wait for power transitions to complete. We do this with no locks held
- 	 * so that we don't deadlock with any pending workqueues.
- 	 */
- 	kbase_pm_wait_for_desired_state(kbdev);
-+#endif
- 
- 	kbase_pm_lock(kbdev);
- 
-+#ifdef CONFIG_MALI_ARBITER_SUPPORT
-+	if (kbase_pm_is_gpu_lost(kbdev))
-+		backend->poweron_required = false;
-+#endif
-+
- 	if (!backend->poweron_required) {
- 		unsigned long flags;
- 
-@@ -278,6 +305,14 @@ static void kbase_pm_gpu_poweroff_wait_wq(struct work_struct *data)
- 			kbase_flush_mmu_wqs(kbdev);
- 			kbase_pm_lock(kbdev);
- 
-+#ifdef CONFIG_MALI_ARBITER_SUPPORT
-+			/* poweron_required may have changed while pm lock
-+			 * was released.
-+			 */
-+			if (kbase_pm_is_gpu_lost(kbdev))
-+				backend->poweron_required = false;
-+#endif
-+
- 			/* Turn off clock now that fault have been handled. We
- 			 * dropped locks so poweron_required may have changed -
- 			 * power back on if this is the case (effectively only
-@@ -296,9 +331,14 @@ static void kbase_pm_gpu_poweroff_wait_wq(struct work_struct *data)
- 	if (backend->poweron_required) {
- 		backend->poweron_required = false;
- 		kbdev->pm.backend.l2_desired = true;
-+#if MALI_USE_CSF
-+		kbdev->pm.backend.mcu_desired = true;
-+#endif
- 		kbase_pm_update_state(kbdev);
- 		kbase_pm_update_cores_state_nolock(kbdev);
-+#if !MALI_USE_CSF
- 		kbase_backend_slot_update(kbdev);
-+#endif /* !MALI_USE_CSF */
- 	}
- 	spin_unlock_irqrestore(&kbdev->hwaccess_lock, flags);
- 
-@@ -451,12 +491,22 @@ static void kbase_pm_hwcnt_disable_worker(struct work_struct *data)
- 		 */
- 		backend->hwcnt_disabled = true;
- 		kbase_pm_update_state(kbdev);
-+#if !MALI_USE_CSF
- 		kbase_backend_slot_update(kbdev);
-+#endif /* !MALI_USE_CSF */
- 	} else {
- 		/* PM state was updated while we were doing the disable,
- 		 * so we need to undo the disable we just performed.
- 		 */
-+#if MALI_USE_CSF
-+		unsigned long lock_flags;
-+
-+		kbase_csf_scheduler_spin_lock(kbdev, &lock_flags);
-+#endif
- 		kbase_hwcnt_context_enable(kbdev->hwcnt_gpu_ctx);
-+#if MALI_USE_CSF
-+		kbase_csf_scheduler_spin_unlock(kbdev, lock_flags);
-+#endif
- 	}
- 
- 	spin_unlock_irqrestore(&kbdev->hwaccess_lock, flags);
-@@ -476,8 +526,12 @@ void kbase_pm_do_poweroff(struct kbase_device *kbdev)
- 	if (kbdev->pm.backend.poweroff_wait_in_progress)
- 		goto unlock_hwaccess;
- 
-+#if MALI_USE_CSF
-+	kbdev->pm.backend.mcu_desired = false;
-+#else
- 	/* Force all cores off */
- 	kbdev->pm.backend.shaders_desired = false;
-+#endif
- 	kbdev->pm.backend.l2_desired = false;
- 
- 	kbdev->pm.backend.poweroff_wait_in_progress = true;
-@@ -528,20 +582,35 @@ int kbase_hwaccess_pm_powerup(struct kbase_device *kbdev,
- 	KBASE_DEBUG_ASSERT(!kbase_pm_is_suspending(kbdev));
- 
- 	/* Power up the GPU, don't enable IRQs as we are not ready to receive
--	 * them. */
-+	 * them
-+	 */
- 	ret = kbase_pm_init_hw(kbdev, flags);
- 	if (ret) {
- 		kbase_pm_unlock(kbdev);
- 		return ret;
- 	}
--
-+#if MALI_USE_CSF
-+	kbdev->pm.debug_core_mask =
-+		kbdev->gpu_props.props.raw_props.shader_present;
-+	spin_lock_irqsave(&kbdev->hwaccess_lock, irq_flags);
-+	/* Set the initial value for 'shaders_avail'. It would be later
-+	 * modified only from the MCU state machine, when the shader core
-+	 * allocation enable mask request has completed. So its value would
-+	 * indicate the mask of cores that are currently being used by FW for
-+	 * the allocation of endpoints requested by CSGs.
-+	 */
-+	kbdev->pm.backend.shaders_avail = kbase_pm_ca_get_core_mask(kbdev);
-+	spin_unlock_irqrestore(&kbdev->hwaccess_lock, irq_flags);
-+#else
- 	kbdev->pm.debug_core_mask_all = kbdev->pm.debug_core_mask[0] =
- 			kbdev->pm.debug_core_mask[1] =
- 			kbdev->pm.debug_core_mask[2] =
- 			kbdev->gpu_props.props.raw_props.shader_present;
-+#endif
- 
- 	/* Pretend the GPU is active to prevent a power policy turning the GPU
--	 * cores off */
-+	 * cores off
-+	 */
- 	kbdev->pm.active_count = 1;
- 
- 	spin_lock_irqsave(&kbdev->pm.backend.gpu_cycle_counter_requests_lock,
-@@ -553,13 +622,27 @@ int kbase_hwaccess_pm_powerup(struct kbase_device *kbdev,
- 								irq_flags);
- 
- 	/* We are ready to receive IRQ's now as power policy is set up, so
--	 * enable them now. */
-+	 * enable them now.
-+	 */
- #ifdef CONFIG_MALI_DEBUG
- 	kbdev->pm.backend.driver_ready_for_irqs = true;
- #endif
- 	kbase_pm_enable_interrupts(kbdev);
- 
-+	WARN_ON(!kbdev->pm.backend.gpu_powered);
-+	/* GPU has been powered up (by kbase_pm_init_hw) and interrupts have
-+	 * been enabled, so GPU is ready for use and PM state machine can be
-+	 * exercised from this point onwards.
-+	 */
-+	kbdev->pm.backend.gpu_ready = true;
-+
- 	/* Turn on the GPU and any cores needed by the policy */
-+#if MALI_USE_CSF
-+	/* Turn on the L2 caches, needed for firmware boot */
-+	spin_lock_irqsave(&kbdev->hwaccess_lock, irq_flags);
-+	kbdev->pm.backend.l2_desired = true;
-+	spin_unlock_irqrestore(&kbdev->hwaccess_lock, irq_flags);
-+#endif
- 	kbase_pm_do_poweron(kbdev, false);
- 	kbase_pm_unlock(kbdev);
- 
-@@ -573,6 +656,8 @@ void kbase_hwaccess_pm_halt(struct kbase_device *kbdev)
- 	mutex_lock(&kbdev->pm.lock);
- 	kbase_pm_do_poweroff(kbdev);
- 	mutex_unlock(&kbdev->pm.lock);
-+
-+	kbase_pm_wait_for_poweroff_complete(kbdev);
- }
- 
- KBASE_EXPORT_TEST_API(kbase_hwaccess_pm_halt);
-@@ -587,10 +672,15 @@ void kbase_hwaccess_pm_term(struct kbase_device *kbdev)
- 
- 	if (kbdev->pm.backend.hwcnt_disabled) {
- 		unsigned long flags;
--
-+#if MALI_USE_CSF
-+		kbase_csf_scheduler_spin_lock(kbdev, &flags);
-+		kbase_hwcnt_context_enable(kbdev->hwcnt_gpu_ctx);
-+		kbase_csf_scheduler_spin_unlock(kbdev, flags);
-+#else
- 		spin_lock_irqsave(&kbdev->hwaccess_lock, flags);
- 		kbase_hwcnt_context_enable(kbdev->hwcnt_gpu_ctx);
- 		spin_unlock_irqrestore(&kbdev->hwaccess_lock, flags);
-+#endif
- 	}
- 
- 	/* Free any resources the policy allocated */
-@@ -598,8 +688,16 @@ void kbase_hwaccess_pm_term(struct kbase_device *kbdev)
- 	kbase_pm_policy_term(kbdev);
- 	kbase_pm_ca_term(kbdev);
- 
-+#if !MALI_USE_CSF
- 	/* Shut down the metrics subsystem */
- 	kbasep_pm_metrics_term(kbdev);
-+#else
-+	if (WARN_ON(mutex_is_locked(&kbdev->pm.backend.policy_change_lock))) {
-+		mutex_lock(&kbdev->pm.backend.policy_change_lock);
-+		mutex_unlock(&kbdev->pm.backend.policy_change_lock);
-+	}
-+	mutex_destroy(&kbdev->pm.backend.policy_change_lock);
-+#endif
- 
- 	destroy_workqueue(kbdev->pm.backend.gpu_poweroff_wait_wq);
- }
-@@ -611,11 +709,24 @@ void kbase_pm_power_changed(struct kbase_device *kbdev)
- 	spin_lock_irqsave(&kbdev->hwaccess_lock, flags);
- 	kbase_pm_update_state(kbdev);
- 
-+#if !MALI_USE_CSF
- 		kbase_backend_slot_update(kbdev);
-+#endif /* !MALI_USE_CSF */
- 
- 	spin_unlock_irqrestore(&kbdev->hwaccess_lock, flags);
- }
- 
-+#if MALI_USE_CSF
-+void kbase_pm_set_debug_core_mask(struct kbase_device *kbdev, u64 new_core_mask)
-+{
-+	lockdep_assert_held(&kbdev->hwaccess_lock);
-+	lockdep_assert_held(&kbdev->pm.lock);
-+
-+	kbdev->pm.debug_core_mask = new_core_mask;
-+	kbase_pm_update_dynamic_cores_onoff(kbdev);
-+}
-+KBASE_EXPORT_TEST_API(kbase_pm_set_debug_core_mask);
-+#else
- void kbase_pm_set_debug_core_mask(struct kbase_device *kbdev,
- 		u64 new_core_mask_js0, u64 new_core_mask_js1,
- 		u64 new_core_mask_js2)
-@@ -636,6 +747,7 @@ void kbase_pm_set_debug_core_mask(struct kbase_device *kbdev,
- 
- 	kbase_pm_update_dynamic_cores_onoff(kbdev);
- }
-+#endif /* MALI_USE_CSF */
- 
- void kbase_hwaccess_pm_gpu_active(struct kbase_device *kbdev)
- {
-@@ -651,12 +763,15 @@ void kbase_hwaccess_pm_suspend(struct kbase_device *kbdev)
- {
- 	/* Force power off the GPU and all cores (regardless of policy), only
- 	 * after the PM active count reaches zero (otherwise, we risk turning it
--	 * off prematurely) */
-+	 * off prematurely)
-+	 */
- 	kbase_pm_lock(kbdev);
- 
- 	kbase_pm_do_poweroff(kbdev);
- 
-+#if !MALI_USE_CSF
- 	kbase_backend_timer_suspend(kbdev);
-+#endif /* !MALI_USE_CSF */
- 
- 	kbase_pm_unlock(kbdev);
- 
-@@ -672,12 +787,19 @@ void kbase_hwaccess_pm_resume(struct kbase_device *kbdev)
- 
- 	kbdev->pm.suspending = false;
- #ifdef CONFIG_MALI_ARBITER_SUPPORT
--	kbdev->pm.gpu_lost = false;
-+	if (kbase_pm_is_gpu_lost(kbdev)) {
-+		dev_dbg(kbdev->dev, "%s: GPU lost in progress\n", __func__);
-+		kbase_pm_unlock(kbdev);
-+		return;
-+	}
- #endif
- 	kbase_pm_do_poweron(kbdev, true);
- 
-+#if !MALI_USE_CSF
- 	kbase_backend_timer_resume(kbdev);
-+#endif /* !MALI_USE_CSF */
- 
-+	wake_up_all(&kbdev->pm.resume_wait);
- 	kbase_pm_unlock(kbdev);
- }
- 
-@@ -685,63 +807,50 @@ void kbase_hwaccess_pm_resume(struct kbase_device *kbdev)
- void kbase_pm_handle_gpu_lost(struct kbase_device *kbdev)
- {
- 	unsigned long flags;
--	struct kbase_pm_backend_data *backend = &kbdev->pm.backend;
- 	ktime_t end_timestamp = ktime_get();
-+	struct kbase_arbiter_vm_state *arb_vm_state = kbdev->pm.arb_vm_state;
- 
--	/* Full GPU reset will have been done by hypervisor, so cancel */
--	atomic_set(&kbdev->hwaccess.backend.reset_gpu,
--			KBASE_RESET_GPU_NOT_PENDING);
--	hrtimer_cancel(&kbdev->hwaccess.backend.reset_timer);
--
--	/* GPU is no longer mapped to VM.  So no interrupts will be received
--	 * and Mali registers have been replaced by dummy RAM
--	 */
--	spin_lock_irqsave(&kbdev->hwaccess_lock, flags);
--	spin_lock(&kbdev->mmu_mask_change);
--	kbdev->irq_reset_flush = true;
--	spin_unlock(&kbdev->mmu_mask_change);
--	spin_unlock_irqrestore(&kbdev->hwaccess_lock, flags);
--	kbase_synchronize_irqs(kbdev);
--	kbase_flush_mmu_wqs(kbdev);
--	kbdev->irq_reset_flush = false;
-+	if (!kbdev->arb.arb_if)
-+		return;
- 
--	/* Clear all jobs running on the GPU */
- 	mutex_lock(&kbdev->pm.lock);
--	kbdev->pm.gpu_lost = true;
--	spin_lock_irqsave(&kbdev->hwaccess_lock, flags);
--	kbdev->protected_mode = false;
--	if (!kbdev->pm.backend.protected_entry_transition_override)
--		kbase_backend_reset(kbdev, &end_timestamp);
--	kbase_pm_metrics_update(kbdev, NULL);
--	spin_unlock_irqrestore(&kbdev->hwaccess_lock, flags);
-+	mutex_lock(&arb_vm_state->vm_state_lock);
-+	if (kbdev->pm.backend.gpu_powered &&
-+			!kbase_pm_is_gpu_lost(kbdev)) {
-+		kbase_pm_set_gpu_lost(kbdev, true);
-+
-+		/* GPU is no longer mapped to VM.  So no interrupts will
-+		 * be received and Mali registers have been replaced by
-+		 * dummy RAM
-+		 */
-+		WARN(!kbase_is_gpu_removed(kbdev),
-+			"GPU is still available after GPU lost event\n");
- 
--	/* Cancel any pending HWC dumps */
--	spin_lock_irqsave(&kbdev->hwcnt.lock, flags);
--	kbdev->hwcnt.backend.state = KBASE_INSTR_STATE_IDLE;
--	kbdev->hwcnt.backend.triggered = 1;
--	wake_up(&kbdev->hwcnt.backend.wait);
--	spin_unlock_irqrestore(&kbdev->hwcnt.lock, flags);
-+		/* Full GPU reset will have been done by hypervisor, so
-+		 * cancel
-+		 */
-+		atomic_set(&kbdev->hwaccess.backend.reset_gpu,
-+				KBASE_RESET_GPU_NOT_PENDING);
-+		hrtimer_cancel(&kbdev->hwaccess.backend.reset_timer);
-+		kbase_synchronize_irqs(kbdev);
- 
--	/* Wait for all threads keeping GPU active to complete */
--	mutex_unlock(&kbdev->pm.lock);
--	wait_event(kbdev->pm.zero_active_count_wait,
--			kbdev->pm.active_count == 0);
--	mutex_lock(&kbdev->pm.lock);
-+		/* Clear all jobs running on the GPU */
-+		spin_lock_irqsave(&kbdev->hwaccess_lock, flags);
-+		kbdev->protected_mode = false;
-+		kbase_backend_reset(kbdev, &end_timestamp);
-+		kbase_pm_metrics_update(kbdev, NULL);
-+		kbase_pm_update_state(kbdev);
-+		spin_unlock_irqrestore(&kbdev->hwaccess_lock, flags);
- 
--	/* Update state to GPU off */
--	spin_lock_irqsave(&kbdev->hwaccess_lock, flags);
--	kbdev->pm.backend.shaders_desired = false;
--	kbdev->pm.backend.l2_desired = false;
--	backend->l2_state = KBASE_L2_OFF;
--	backend->shaders_state = KBASE_SHADERS_OFF_CORESTACK_OFF;
--	kbdev->pm.backend.gpu_powered = false;
--	backend->poweroff_wait_in_progress = false;
--	KBASE_KTRACE_ADD(kbdev, PM_WAKE_WAITERS, NULL, 0);
--	wake_up(&kbdev->pm.backend.gpu_in_desired_state_wait);
--	kbase_gpu_cache_clean_wait_complete(kbdev);
--	backend->poweroff_wait_in_progress = false;
--	spin_unlock_irqrestore(&kbdev->hwaccess_lock, flags);
--	wake_up(&kbdev->pm.backend.poweroff_wait);
-+		/* Cancel any pending HWC dumps */
-+		spin_lock_irqsave(&kbdev->hwcnt.lock, flags);
-+		kbdev->hwcnt.backend.state = KBASE_INSTR_STATE_IDLE;
-+		kbdev->hwcnt.backend.triggered = 1;
-+		wake_up(&kbdev->hwcnt.backend.wait);
-+		spin_unlock_irqrestore(&kbdev->hwcnt.lock, flags);
-+	}
-+	mutex_unlock(&arb_vm_state->vm_state_lock);
- 	mutex_unlock(&kbdev->pm.lock);
- }
-+
- #endif /* CONFIG_MALI_ARBITER_SUPPORT */
-diff --git a/dvalin/kernel/drivers/gpu/arm/midgard/backend/gpu/mali_kbase_pm_ca.c b/dvalin/kernel/drivers/gpu/arm/midgard/backend/gpu/mali_kbase_pm_ca.c
-index e7eef26..efc620f 100644
---- a/dvalin/kernel/drivers/gpu/arm/midgard/backend/gpu/mali_kbase_pm_ca.c
-+++ b/dvalin/kernel/drivers/gpu/arm/midgard/backend/gpu/mali_kbase_pm_ca.c
-@@ -1,11 +1,12 @@
-+// SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note
- /*
-  *
-- * (C) COPYRIGHT 2013-2018, 2020 ARM Limited. All rights reserved.
-+ * (C) COPYRIGHT 2013-2021 ARM Limited. All rights reserved.
-  *
-  * This program is free software and is provided to you under the terms of the
-  * GNU General Public License version 2 as published by the Free Software
-  * Foundation, and any use by you of this program is subject to the terms
-- * of such GNU licence.
-+ * of such GNU license.
-  *
-  * This program is distributed in the hope that it will be useful,
-  * but WITHOUT ANY WARRANTY; without even the implied warranty of
-@@ -16,8 +17,6 @@
-  * along with this program; if not, you can access it online at
-  * http://www.gnu.org/licenses/gpl-2.0.html.
-  *
-- * SPDX-License-Identifier: GPL-2.0
-- *
-  */
- 
- /*
-@@ -27,9 +26,6 @@
- #include <mali_kbase.h>
- #include <mali_kbase_pm.h>
- #include <backend/gpu/mali_kbase_pm_internal.h>
--#ifdef CONFIG_MALI_NO_MALI
--#include <backend/gpu/mali_kbase_model_dummy.h>
--#endif
- #include <mali_kbase_dummy_job_wa.h>
- 
- int kbase_pm_ca_init(struct kbase_device *kbdev)
-@@ -59,6 +55,14 @@ void kbase_devfreq_set_core_mask(struct kbase_device *kbdev, u64 core_mask)
- 
- 	spin_lock_irqsave(&kbdev->hwaccess_lock, flags);
- 
-+#if MALI_USE_CSF
-+	if (!(core_mask & kbdev->pm.debug_core_mask)) {
-+		dev_err(kbdev->dev,
-+			"OPP core mask 0x%llX does not intersect with debug mask 0x%llX\n",
-+			core_mask, kbdev->pm.debug_core_mask);
-+		goto unlock;
-+	}
-+#else
- 	if (!(core_mask & kbdev->pm.debug_core_mask_all)) {
- 		dev_err(kbdev->dev, "OPP core mask 0x%llX does not intersect with debug mask 0x%llX\n",
- 				core_mask, kbdev->pm.debug_core_mask_all);
-@@ -69,6 +73,7 @@ void kbase_devfreq_set_core_mask(struct kbase_device *kbdev, u64 core_mask)
- 		dev_err(kbdev->dev, "Dynamic core scaling not supported as dummy job WA is enabled");
- 		goto unlock;
- 	}
-+#endif /* MALI_USE_CSF */
- 
- 	pm_backend->ca_cores_enabled = core_mask;
- 
-@@ -80,21 +85,32 @@ unlock:
- 	dev_dbg(kbdev->dev, "Devfreq policy : new core mask=%llX\n",
- 			pm_backend->ca_cores_enabled);
- }
-+KBASE_EXPORT_TEST_API(kbase_devfreq_set_core_mask);
- #endif
- 
- u64 kbase_pm_ca_get_core_mask(struct kbase_device *kbdev)
- {
--#ifdef CONFIG_MALI_DEVFREQ
--	struct kbase_pm_backend_data *pm_backend = &kbdev->pm.backend;
-+#if MALI_USE_CSF
-+	u64 debug_core_mask = kbdev->pm.debug_core_mask;
-+#else
-+	u64 debug_core_mask = kbdev->pm.debug_core_mask_all;
- #endif
- 
- 	lockdep_assert_held(&kbdev->hwaccess_lock);
- 
- #ifdef CONFIG_MALI_DEVFREQ
--	return pm_backend->ca_cores_enabled & kbdev->pm.debug_core_mask_all;
-+	/*
-+	 * Although in the init we let the pm_backend->ca_cores_enabled to be
-+	 * the max config (it uses the base_gpu_props), at this function we need
-+	 * to limit it to be a subgroup of the curr config, otherwise the
-+	 * shaders state machine on the PM does not evolve.
-+	 */
-+	return kbdev->gpu_props.curr_config.shader_present &
-+			kbdev->pm.backend.ca_cores_enabled &
-+			debug_core_mask;
- #else
--	return kbdev->gpu_props.props.raw_props.shader_present &
--			kbdev->pm.debug_core_mask_all;
-+	return kbdev->gpu_props.curr_config.shader_present &
-+		debug_core_mask;
- #endif
- }
- 
-@@ -104,8 +120,8 @@ u64 kbase_pm_ca_get_instr_core_mask(struct kbase_device *kbdev)
- {
- 	lockdep_assert_held(&kbdev->hwaccess_lock);
- 
--#ifdef CONFIG_MALI_NO_MALI
--	return (((1ull) << KBASE_DUMMY_MODEL_MAX_SHADER_CORES) - 1);
-+#if   MALI_USE_CSF
-+	return kbase_pm_get_ready_cores(kbdev, KBASE_PM_CORE_SHADER);
- #else
- 	return kbdev->pm.backend.pm_shaders_core_mask;
- #endif
-diff --git a/dvalin/kernel/drivers/gpu/arm/midgard/backend/gpu/mali_kbase_pm_ca.h b/dvalin/kernel/drivers/gpu/arm/midgard/backend/gpu/mali_kbase_pm_ca.h
-index 5423e96..8d169c3 100644
---- a/dvalin/kernel/drivers/gpu/arm/midgard/backend/gpu/mali_kbase_pm_ca.h
-+++ b/dvalin/kernel/drivers/gpu/arm/midgard/backend/gpu/mali_kbase_pm_ca.h
-@@ -1,11 +1,12 @@
-+/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
- /*
-  *
-- * (C) COPYRIGHT 2011-2018 ARM Limited. All rights reserved.
-+ * (C) COPYRIGHT 2011-2018, 2020-2021 ARM Limited. All rights reserved.
-  *
-  * This program is free software and is provided to you under the terms of the
-  * GNU General Public License version 2 as published by the Free Software
-  * Foundation, and any use by you of this program is subject to the terms
-- * of such GNU licence.
-+ * of such GNU license.
-  *
-  * This program is distributed in the hope that it will be useful,
-  * but WITHOUT ANY WARRANTY; without even the implied warranty of
-@@ -16,8 +17,6 @@
-  * along with this program; if not, you can access it online at
-  * http://www.gnu.org/licenses/gpl-2.0.html.
-  *
-- * SPDX-License-Identifier: GPL-2.0
-- *
-  */
- 
- /*
-diff --git a/dvalin/kernel/drivers/gpu/arm/midgard/backend/gpu/mali_kbase_pm_ca_devfreq.h b/dvalin/kernel/drivers/gpu/arm/midgard/backend/gpu/mali_kbase_pm_ca_devfreq.h
-index f67ec65..41f3c14 100644
---- a/dvalin/kernel/drivers/gpu/arm/midgard/backend/gpu/mali_kbase_pm_ca_devfreq.h
-+++ b/dvalin/kernel/drivers/gpu/arm/midgard/backend/gpu/mali_kbase_pm_ca_devfreq.h
-@@ -1,11 +1,12 @@
-+/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
- /*
-  *
-- * (C) COPYRIGHT 2017 ARM Limited. All rights reserved.
-+ * (C) COPYRIGHT 2017, 2020-2021 ARM Limited. All rights reserved.
-  *
-  * This program is free software and is provided to you under the terms of the
-  * GNU General Public License version 2 as published by the Free Software
-  * Foundation, and any use by you of this program is subject to the terms
-- * of such GNU licence.
-+ * of such GNU license.
-  *
-  * This program is distributed in the hope that it will be useful,
-  * but WITHOUT ANY WARRANTY; without even the implied warranty of
-@@ -16,8 +17,6 @@
-  * along with this program; if not, you can access it online at
-  * http://www.gnu.org/licenses/gpl-2.0.html.
-  *
-- * SPDX-License-Identifier: GPL-2.0
-- *
-  */
- 
- /*
-diff --git a/dvalin/kernel/drivers/gpu/arm/midgard/backend/gpu/mali_kbase_pm_coarse_demand.c b/dvalin/kernel/drivers/gpu/arm/midgard/backend/gpu/mali_kbase_pm_coarse_demand.c
-index 9eef44a..f40b753 100644
---- a/dvalin/kernel/drivers/gpu/arm/midgard/backend/gpu/mali_kbase_pm_coarse_demand.c
-+++ b/dvalin/kernel/drivers/gpu/arm/midgard/backend/gpu/mali_kbase_pm_coarse_demand.c
-@@ -1,11 +1,12 @@
-+// SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note
- /*
-  *
-- * (C) COPYRIGHT 2012-2016, 2018-2019 ARM Limited. All rights reserved.
-+ * (C) COPYRIGHT 2012-2016, 2018-2021 ARM Limited. All rights reserved.
-  *
-  * This program is free software and is provided to you under the terms of the
-  * GNU General Public License version 2 as published by the Free Software
-  * Foundation, and any use by you of this program is subject to the terms
-- * of such GNU licence.
-+ * of such GNU license.
-  *
-  * This program is distributed in the hope that it will be useful,
-  * but WITHOUT ANY WARRANTY; without even the implied warranty of
-@@ -16,12 +17,8 @@
-  * along with this program; if not, you can access it online at
-  * http://www.gnu.org/licenses/gpl-2.0.html.
-  *
-- * SPDX-License-Identifier: GPL-2.0
-- *
-  */
- 
--
--
- /*
-  * "Coarse Demand" power management policy
-  */
-@@ -60,7 +57,11 @@ const struct kbase_pm_policy kbase_pm_coarse_demand_policy_ops = {
- 	coarse_demand_term,			/* term */
- 	coarse_demand_shaders_needed,		/* shaders_needed */
- 	coarse_demand_get_core_active,		/* get_core_active */
-+	NULL,					/* handle_event */
- 	KBASE_PM_POLICY_ID_COARSE_DEMAND,	/* id */
-+#if MALI_USE_CSF
-+	COARSE_ON_DEMAND_PM_SCHED_FLAGS,	/* pm_sched_flags */
-+#endif
- };
- 
- KBASE_EXPORT_TEST_API(kbase_pm_coarse_demand_policy_ops);
-diff --git a/dvalin/kernel/drivers/gpu/arm/midgard/backend/gpu/mali_kbase_pm_coarse_demand.h b/dvalin/kernel/drivers/gpu/arm/midgard/backend/gpu/mali_kbase_pm_coarse_demand.h
-index 304e5d7..5e3f17e 100644
---- a/dvalin/kernel/drivers/gpu/arm/midgard/backend/gpu/mali_kbase_pm_coarse_demand.h
-+++ b/dvalin/kernel/drivers/gpu/arm/midgard/backend/gpu/mali_kbase_pm_coarse_demand.h
-@@ -1,11 +1,12 @@
-+/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
- /*
-  *
-- * (C) COPYRIGHT 2012-2015,2018 ARM Limited. All rights reserved.
-+ * (C) COPYRIGHT 2012-2015, 2018, 2020-2021 ARM Limited. All rights reserved.
-  *
-  * This program is free software and is provided to you under the terms of the
-  * GNU General Public License version 2 as published by the Free Software
-  * Foundation, and any use by you of this program is subject to the terms
-- * of such GNU licence.
-+ * of such GNU license.
-  *
-  * This program is distributed in the hope that it will be useful,
-  * but WITHOUT ANY WARRANTY; without even the implied warranty of
-@@ -16,12 +17,8 @@
-  * along with this program; if not, you can access it online at
-  * http://www.gnu.org/licenses/gpl-2.0.html.
-  *
-- * SPDX-License-Identifier: GPL-2.0
-- *
-  */
- 
--
--
- /*
-  * "Coarse Demand" power management policy
-  */
-diff --git a/dvalin/kernel/drivers/gpu/arm/midgard/backend/gpu/mali_kbase_pm_defs.h b/dvalin/kernel/drivers/gpu/arm/midgard/backend/gpu/mali_kbase_pm_defs.h
-index f4bcf3e..1a0572b 100644
---- a/dvalin/kernel/drivers/gpu/arm/midgard/backend/gpu/mali_kbase_pm_defs.h
-+++ b/dvalin/kernel/drivers/gpu/arm/midgard/backend/gpu/mali_kbase_pm_defs.h
-@@ -1,11 +1,12 @@
-+/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
- /*
-  *
-- * (C) COPYRIGHT 2014-2020 ARM Limited. All rights reserved.
-+ * (C) COPYRIGHT 2014-2021 ARM Limited. All rights reserved.
-  *
-  * This program is free software and is provided to you under the terms of the
-  * GNU General Public License version 2 as published by the Free Software
-  * Foundation, and any use by you of this program is subject to the terms
-- * of such GNU licence.
-+ * of such GNU license.
-  *
-  * This program is distributed in the hope that it will be useful,
-  * but WITHOUT ANY WARRANTY; without even the implied warranty of
-@@ -16,8 +17,6 @@
-  * along with this program; if not, you can access it online at
-  * http://www.gnu.org/licenses/gpl-2.0.html.
-  *
-- * SPDX-License-Identifier: GPL-2.0
-- *
-  */
- 
- /*
-@@ -29,9 +28,6 @@
- 
- #include "mali_kbase_pm_always_on.h"
- #include "mali_kbase_pm_coarse_demand.h"
--#if !MALI_CUSTOMER_RELEASE
--#include "mali_kbase_pm_always_on_demand.h"
--#endif
- 
- /* Forward definition - see mali_kbase.h */
- struct kbase_device;
-@@ -62,24 +58,9 @@ enum kbase_pm_core_type {
- 	KBASE_PM_CORE_STACK = STACK_PRESENT_LO
- };
- 
--/**
-+/*
-  * enum kbase_l2_core_state - The states used for the L2 cache & tiler power
-  *                            state machine.
-- *
-- * @KBASE_L2_OFF: The L2 cache and tiler are off
-- * @KBASE_L2_PEND_ON: The L2 cache and tiler are powering on
-- * @KBASE_L2_RESTORE_CLOCKS: The GPU clock is restored. Conditionally used.
-- * @KBASE_L2_ON_HWCNT_ENABLE: The L2 cache and tiler are on, and hwcnt is being
-- *                            enabled
-- * @KBASE_L2_ON: The L2 cache and tiler are on, and hwcnt is enabled
-- * @KBASE_L2_ON_HWCNT_DISABLE: The L2 cache and tiler are on, and hwcnt is being
-- *                             disabled
-- * @KBASE_L2_SLOW_DOWN_CLOCKS: The GPU clock is set to appropriate or lowest
-- *                             clock. Conditionally used.
-- * @KBASE_L2_POWER_DOWN: The L2 cache and tiler are about to be powered off
-- * @KBASE_L2_PEND_OFF: The L2 cache and tiler are powering off
-- * @KBASE_L2_RESET_WAIT: The GPU is resetting, L2 cache and tiler power state
-- *                       are unknown
-  */
- enum kbase_l2_core_state {
- #define KBASEP_L2_STATE(n) KBASE_L2_ ## n,
-@@ -87,45 +68,19 @@ enum kbase_l2_core_state {
- #undef KBASEP_L2_STATE
- };
- 
--/**
-+#if MALI_USE_CSF
-+/*
-+ * enum kbase_mcu_state - The states used for the MCU state machine.
-+ */
-+enum kbase_mcu_state {
-+#define KBASEP_MCU_STATE(n) KBASE_MCU_ ## n,
-+#include "mali_kbase_pm_mcu_states.h"
-+#undef KBASEP_MCU_STATE
-+};
-+#endif
-+
-+/*
-  * enum kbase_shader_core_state - The states used for the shaders' state machine.
-- *
-- * @KBASE_SHADERS_OFF_CORESTACK_OFF: The shaders and core stacks are off
-- * @KBASE_SHADERS_OFF_CORESTACK_PEND_ON: The shaders are off, core stacks have
-- *                                       been requested to power on and hwcnt
-- *                                       is being disabled
-- * @KBASE_SHADERS_PEND_ON_CORESTACK_ON: Core stacks are on, shaders have been
-- *                                      requested to power on. Or after doing
-- *                                      partial shader on/off, checking whether
-- *                                      it's the desired state.
-- * @KBASE_SHADERS_ON_CORESTACK_ON: The shaders and core stacks are on, and hwcnt
-- *					already enabled.
-- * @KBASE_SHADERS_ON_CORESTACK_ON_RECHECK: The shaders and core stacks
-- *                                      are on, hwcnt disabled, and checks
-- *                                      to powering down or re-enabling
-- *                                      hwcnt.
-- * @KBASE_SHADERS_WAIT_OFF_CORESTACK_ON: The shaders have been requested to
-- *                                       power off, but they remain on for the
-- *                                       duration of the hysteresis timer
-- * @KBASE_SHADERS_WAIT_GPU_IDLE: The shaders partial poweroff needs to reach
-- *                               a state where jobs on the GPU are finished
-- *                               including jobs currently running and in the
-- *                               GPU queue because of GPU2017-861
-- * @KBASE_SHADERS_WAIT_FINISHED_CORESTACK_ON: The hysteresis timer has expired
-- * @KBASE_SHADERS_L2_FLUSHING_CORESTACK_ON: The core stacks are on and the
-- *                                          level 2 cache is being flushed.
-- * @KBASE_SHADERS_READY_OFF_CORESTACK_ON: The core stacks are on and the shaders
-- *                                        are ready to be powered off.
-- * @KBASE_SHADERS_PEND_OFF_CORESTACK_ON: The core stacks are on, and the shaders
-- *                                       have been requested to power off
-- * @KBASE_SHADERS_OFF_CORESTACK_PEND_OFF: The shaders are off, and the core stacks
-- *                                        have been requested to power off
-- * @KBASE_SHADERS_OFF_CORESTACK_OFF_TIMER_PEND_OFF: Shaders and corestacks are
-- *                                                  off, but the tick timer
-- *                                                  cancellation is still
-- *                                                  pending.
-- * @KBASE_SHADERS_RESET_WAIT: The GPU is resetting, shader and core stack power
-- *                            states are unknown
-  */
- enum kbase_shader_core_state {
- #define KBASEP_SHADER_STATE(n) KBASE_SHADERS_ ## n,
-@@ -137,28 +92,40 @@ enum kbase_shader_core_state {
-  * struct kbasep_pm_metrics - Metrics data collected for use by the power
-  *                            management framework.
-  *
-- *  @time_busy: number of ns the GPU was busy executing jobs since the
-- *          @time_period_start timestamp.
-- *  @time_idle: number of ns since time_period_start the GPU was not executing
-- *          jobs since the @time_period_start timestamp.
-- *  @busy_cl: number of ns the GPU was busy executing CL jobs. Note that
-- *           if two CL jobs were active for 400ns, this value would be updated
-- *           with 800.
-- *  @busy_gl: number of ns the GPU was busy executing GL jobs. Note that
-- *           if two GL jobs were active for 400ns, this value would be updated
-- *           with 800.
-+ *  @time_busy: the amount of time the GPU was busy executing jobs since the
-+ *          @time_period_start timestamp, in units of 256ns. This also includes
-+ *          time_in_protm, the time spent in protected mode, since it's assumed
-+ *          the GPU was busy 100% during this period.
-+ *  @time_idle: the amount of time the GPU was not executing jobs since the
-+ *              time_period_start timestamp, measured in units of 256ns.
-+ *  @time_in_protm: The amount of time the GPU has spent in protected mode since
-+ *                  the time_period_start timestamp, measured in units of 256ns.
-+ *  @busy_cl: the amount of time the GPU was busy executing CL jobs. Note that
-+ *           if two CL jobs were active for 256ns, this value would be updated
-+ *           with 2 (2x256ns).
-+ *  @busy_gl: the amount of time the GPU was busy executing GL jobs. Note that
-+ *           if two GL jobs were active for 256ns, this value would be updated
-+ *           with 2 (2x256ns).
-  */
- struct kbasep_pm_metrics {
- 	u32 time_busy;
- 	u32 time_idle;
-+#if MALI_USE_CSF
-+	u32 time_in_protm;
-+#else
- 	u32 busy_cl[2];
- 	u32 busy_gl;
-+#endif
- };
- 
- /**
-  * struct kbasep_pm_metrics_state - State required to collect the metrics in
-  *                                  struct kbasep_pm_metrics
-  *  @time_period_start: time at which busy/idle measurements started
-+ *  @ipa_control_client: Handle returned on registering DVFS as a
-+ *                       kbase_ipa_control client
-+ *  @skip_gpu_active_sanity_check: Decide whether to skip GPU_ACTIVE sanity
-+ *                                 check in DVFS utilisation calculation
-  *  @gpu_active: true when the GPU is executing jobs. false when
-  *           not. Updated when the job scheduler informs us a job in submitted
-  *           or removed from a GPU slot.
-@@ -170,6 +137,7 @@ struct kbasep_pm_metrics {
-  *  @values: The current values of the power management metrics. The
-  *           kbase_pm_get_dvfs_metrics() function is used to compare these
-  *           current values with the saved values from a previous invocation.
-+ *  @initialized: tracks whether metrics_state has been initialized or not.
-  *  @timer: timer to regularly make DVFS decisions based on the power
-  *           management metrics.
-  *  @timer_active: boolean indicating @timer is running
-@@ -178,9 +146,14 @@ struct kbasep_pm_metrics {
-  */
- struct kbasep_pm_metrics_state {
- 	ktime_t time_period_start;
-+#if MALI_USE_CSF
-+	void *ipa_control_client;
-+	bool skip_gpu_active_sanity_check;
-+#else
- 	bool gpu_active;
- 	u32 active_cl_ctx[2];
- 	u32 active_gl_ctx[3];
-+#endif
- 	spinlock_t lock;
- 
- 	void *platform_data;
-@@ -189,6 +162,7 @@ struct kbasep_pm_metrics_state {
- 	struct kbasep_pm_metrics values;
- 
- #ifdef CONFIG_MALI_MIDGARD_DVFS
-+	bool initialized;
- 	struct hrtimer timer;
- 	bool timer_active;
- 	struct kbasep_pm_metrics dvfs_last;
-@@ -202,8 +176,12 @@ struct kbasep_pm_metrics_state {
-  * @work: Work item which cancels the timer
-  * @timer: Timer for powering off the shader cores
-  * @configured_interval: Period of GPU poweroff timer
-- * @configured_ticks: User-configured number of ticks to wait after the shader
-- *                    power down request is received before turning off the cores
-+ * @default_ticks: User-configured number of ticks to wait after the shader
-+ *                 power down request is received before turning off the cores
-+ * @configured_ticks: Power-policy configured number of ticks to wait after the
-+ *                    shader power down request is received before turning off
-+ *                    the cores. For simple power policies, this is equivalent
-+ *                    to @default_ticks.
-  * @remaining_ticks: Number of remaining timer ticks until shaders are powered off
-  * @cancel_queued: True if the cancellation work item has been queued. This is
-  *                 required to ensure that it is not queued twice, e.g. after
-@@ -217,6 +195,7 @@ struct kbasep_pm_tick_timer_state {
- 	struct hrtimer timer;
- 
- 	ktime_t configured_interval;
-+	unsigned int default_ticks;
- 	unsigned int configured_ticks;
- 	unsigned int remaining_ticks;
- 
-@@ -227,9 +206,6 @@ struct kbasep_pm_tick_timer_state {
- union kbase_pm_policy_data {
- 	struct kbasep_pm_policy_always_on always_on;
- 	struct kbasep_pm_policy_coarse_demand coarse_demand;
--#if !MALI_CUSTOMER_RELEASE
--	struct kbasep_pm_policy_always_on_demand always_on_demand;
--#endif
- };
- 
- /**
-@@ -240,7 +216,8 @@ union kbase_pm_policy_data {
-  *
-  * @pm_current_policy: The policy that is currently actively controlling the
-  *                     power state.
-- * @pm_policy_data:    Private data for current PM policy
-+ * @pm_policy_data:    Private data for current PM policy. This is automatically
-+ *                     zeroed when a policy change occurs.
-  * @reset_done:        Flag when a reset is complete
-  * @reset_done_wait:   Wait queue to wait for changes to @reset_done
-  * @gpu_cycle_counter_requests: The reference count of active gpu cycle counter
-@@ -254,6 +231,11 @@ union kbase_pm_policy_data {
-  *                     variable should be protected by: both the hwaccess_lock
-  *                     spinlock and the pm.lock mutex for writes; or at least
-  *                     one of either lock for reads.
-+ * @gpu_ready:         Indicates whether the GPU is in a state in which it is
-+ *                     safe to perform PM changes. When false, the PM state
-+ *                     machine needs to wait before making changes to the GPU
-+ *                     power policy, DevFreq or core_mask, so as to avoid these
-+ *                     changing while implicit GPU resets are ongoing.
-  * @pm_shaders_core_mask: Shader PM state synchronised shaders core mask. It
-  *                     holds the cores enabled in a hardware counters dump,
-  *                     and may differ from @shaders_avail when under different
-@@ -294,6 +276,8 @@ union kbase_pm_policy_data {
-  * @callback_soft_reset: Optional callback to software reset the GPU. See
-  *                       &struct kbase_pm_callback_conf
-  * @ca_cores_enabled: Cores that are currently available
-+ * @mcu_state: The current state of the micro-control unit, only applicable
-+ *             to GPUs that have such a component
-  * @l2_state:     The current state of the L2 cache state machine. See
-  *                &enum kbase_l2_core_state
-  * @l2_desired:   True if the L2 cache should be powered on by the L2 cache state
-@@ -303,10 +287,10 @@ union kbase_pm_policy_data {
-  * @shaders_avail: This is updated by the state machine when it is in a state
-  *                 where it can write to the SHADER_PWRON or PWROFF registers
-  *                 to have the same set of available cores as specified by
-- *                 @shaders_desired_mask. So it would eventually have the same
-- *                 value as @shaders_desired_mask and would precisely indicate
-- *                 the cores that are currently available. This is internal to
-- *                 shader state machine and should *not* be modified elsewhere.
-+ *                 @shaders_desired_mask. So would precisely indicate the cores
-+ *                 that are currently available. This is internal to shader
-+ *                 state machine of JM GPUs and should *not* be modified
-+ *                 elsewhere.
-  * @shaders_desired_mask: This is updated by the state machine when it is in
-  *                        a state where it can handle changes to the core
-  *                        availability (either by DVFS or sysfs). This is
-@@ -318,6 +302,16 @@ union kbase_pm_policy_data {
-  *                   cores may be different, but there should be transitions in
-  *                   progress that will eventually achieve this state (assuming
-  *                   that the policy doesn't change its mind in the mean time).
-+ * @mcu_desired: True if the micro-control unit should be powered on
-+ * @policy_change_clamp_state_to_off: Signaling the backend is in PM policy
-+ *                change transition, needs the mcu/L2 to be brought back to the
-+ *                off state and remain in that state until the flag is cleared.
-+ * @csf_pm_sched_flags: CSF Dynamic PM control flags in accordance to the
-+ *                current active PM policy. This field is updated whenever a
-+ *                new policy is activated.
-+ * @policy_change_lock: Used to serialize the policy change calls. In CSF case,
-+ *                      the change of policy may involve the scheduler to
-+ *                      suspend running CSGs and then reconfigure the MCU.
-  * @in_reset: True if a GPU is resetting and normal power manager operation is
-  *            suspended
-  * @partial_shaderoff: True if we want to partial power off shader cores,
-@@ -373,6 +367,7 @@ struct kbase_pm_backend_data {
- 	wait_queue_head_t gpu_in_desired_state_wait;
- 
- 	bool gpu_powered;
-+	bool gpu_ready;
- 
- 	u64 pm_shaders_core_mask;
- 
-@@ -406,10 +401,19 @@ struct kbase_pm_backend_data {
- 
- 	u64 ca_cores_enabled;
- 
-+#if MALI_USE_CSF
-+	enum kbase_mcu_state mcu_state;
-+#endif
- 	enum kbase_l2_core_state l2_state;
- 	enum kbase_shader_core_state shaders_state;
- 	u64 shaders_avail;
- 	u64 shaders_desired_mask;
-+#if MALI_USE_CSF
-+	bool mcu_desired;
-+	bool policy_change_clamp_state_to_off;
-+	unsigned int csf_pm_sched_flags;
-+	struct mutex policy_change_lock;
-+#endif
- 	bool l2_desired;
- 	bool l2_always_on;
- 	bool shaders_desired;
-@@ -433,6 +437,23 @@ struct kbase_pm_backend_data {
- 	struct work_struct gpu_clock_control_work;
- };
- 
-+#if MALI_USE_CSF
-+/* CSF PM flag, signaling that the MCU CORE should be kept on */
-+#define  CSF_DYNAMIC_PM_CORE_KEEP_ON (1 << 0)
-+/* CSF PM flag, signaling no scheduler suspension on idle groups */
-+#define CSF_DYNAMIC_PM_SCHED_IGNORE_IDLE (1 << 1)
-+/* CSF PM flag, signaling no scheduler suspension on no runnable groups */
-+#define CSF_DYNAMIC_PM_SCHED_NO_SUSPEND (1 << 2)
-+
-+/* The following flags corresponds to existing defined PM policies */
-+#define ALWAYS_ON_PM_SCHED_FLAGS (CSF_DYNAMIC_PM_CORE_KEEP_ON | \
-+				  CSF_DYNAMIC_PM_SCHED_IGNORE_IDLE | \
-+				  CSF_DYNAMIC_PM_SCHED_NO_SUSPEND)
-+#define COARSE_ON_DEMAND_PM_SCHED_FLAGS (0)
-+#if !MALI_CUSTOMER_RELEASE
-+#define ALWAYS_ON_DEMAND_PM_SCHED_FLAGS (CSF_DYNAMIC_PM_SCHED_IGNORE_IDLE)
-+#endif
-+#endif
- 
- /* List of policy IDs */
- enum kbase_pm_policy_id {
-@@ -443,6 +464,33 @@ enum kbase_pm_policy_id {
- 	KBASE_PM_POLICY_ID_ALWAYS_ON
- };
- 
-+/**
-+ * enum kbase_pm_policy_event - PM Policy event ID
-+ */
-+enum kbase_pm_policy_event {
-+	/**
-+	 * @KBASE_PM_POLICY_EVENT_IDLE: Indicates that the GPU power state
-+	 * model has determined that the GPU has gone idle.
-+	 */
-+	KBASE_PM_POLICY_EVENT_IDLE,
-+	/**
-+	 * @KBASE_PM_POLICY_EVENT_POWER_ON: Indicates that the GPU state model
-+	 * is preparing to power on the GPU.
-+	 */
-+	KBASE_PM_POLICY_EVENT_POWER_ON,
-+	/**
-+	 * @KBASE_PM_POLICY_EVENT_TIMER_HIT: Indicates that the GPU became
-+	 * active while the Shader Tick Timer was holding the GPU in a powered
-+	 * on state.
-+	 */
-+	KBASE_PM_POLICY_EVENT_TIMER_HIT,
-+	/**
-+	 * @KBASE_PM_POLICY_EVENT_TIMER_MISS: Indicates that the GPU did not
-+	 * become active before the Shader Tick Timer timeout occurred.
-+	 */
-+	KBASE_PM_POLICY_EVENT_TIMER_MISS,
-+};
-+
- /**
-  * struct kbase_pm_policy - Power policy structure.
-  *
-@@ -455,15 +503,22 @@ enum kbase_pm_policy_id {
-  * @shaders_needed:     Function called to find out if shader cores are needed
-  * @get_core_active:    Function called to get the current overall GPU power
-  *                      state
-+ * @handle_event:       Function called when a PM policy event occurs. Should be
-+ *                      set to NULL if the power policy doesn't require any
-+ *                      event notifications.
-  * @id:                 Field indicating an ID for this policy. This is not
-  *                      necessarily the same as its index in the list returned
-  *                      by kbase_pm_list_policies().
-  *                      It is used purely for debugging.
-+ * @pm_sched_flags: Policy associated with CSF PM scheduling operational flags.
-+ *                  Pre-defined required flags exist for each of the
-+ *                  ARM released policies, such as 'always_on', 'coarse_demand'
-+ *                  and etc.
-  */
- struct kbase_pm_policy {
- 	char *name;
- 
--	/**
-+	/*
- 	 * Function called when the policy is selected
- 	 *
- 	 * This should initialize the kbdev->pm.pm_policy_data structure. It
-@@ -477,7 +532,7 @@ struct kbase_pm_policy {
- 	 */
- 	void (*init)(struct kbase_device *kbdev);
- 
--	/**
-+	/*
- 	 * Function called when the policy is unselected.
- 	 *
- 	 * @kbdev: The kbase device structure for the device (must be a
-@@ -485,7 +540,7 @@ struct kbase_pm_policy {
- 	 */
- 	void (*term)(struct kbase_device *kbdev);
- 
--	/**
-+	/*
- 	 * Function called to find out if shader cores are needed
- 	 *
- 	 * This needs to at least satisfy kbdev->pm.backend.shaders_desired,
-@@ -498,7 +553,7 @@ struct kbase_pm_policy {
- 	 */
- 	bool (*shaders_needed)(struct kbase_device *kbdev);
- 
--	/**
-+	/*
- 	 * Function called to get the current overall GPU power state
- 	 *
- 	 * This function must meet or exceed the requirements for power
-@@ -511,7 +566,26 @@ struct kbase_pm_policy {
- 	 */
- 	bool (*get_core_active)(struct kbase_device *kbdev);
- 
-+	/**
-+	 * Function called when a power event occurs
-+	 *
-+	 * @kbdev: The kbase device structure for the device (must be a
-+	 *         valid pointer)
-+	 * @event: The id of the power event that has occurred
-+	 */
-+	void (*handle_event)(struct kbase_device *kbdev,
-+			     enum kbase_pm_policy_event event);
-+
- 	enum kbase_pm_policy_id id;
-+
-+#if MALI_USE_CSF
-+	/* Policy associated with CSF PM scheduling operational flags.
-+	 * There are pre-defined required flags exist for each of the
-+	 * ARM released policies, such as 'always_on', 'coarse_demand'
-+	 * and etc.
-+	 */
-+	unsigned int pm_sched_flags;
-+#endif
- };
- 
- #endif /* _KBASE_PM_HWACCESS_DEFS_H_ */
-diff --git a/dvalin/kernel/drivers/gpu/arm/midgard/backend/gpu/mali_kbase_pm_driver.c b/dvalin/kernel/drivers/gpu/arm/midgard/backend/gpu/mali_kbase_pm_driver.c
-index 6b821f7..bcada93 100644
---- a/dvalin/kernel/drivers/gpu/arm/midgard/backend/gpu/mali_kbase_pm_driver.c
-+++ b/dvalin/kernel/drivers/gpu/arm/midgard/backend/gpu/mali_kbase_pm_driver.c
-@@ -1,12 +1,12 @@
--// SPDX-License-Identifier: GPL-2.0
-+// SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note
- /*
-  *
-- * (C) COPYRIGHT 2010-2020 ARM Limited. All rights reserved.
-+ * (C) COPYRIGHT 2010-2021 ARM Limited. All rights reserved.
-  *
-  * This program is free software and is provided to you under the terms of the
-  * GNU General Public License version 2 as published by the Free Software
-  * Foundation, and any use by you of this program is subject to the terms
-- * of such GNU licence.
-+ * of such GNU license.
-  *
-  * This program is distributed in the hope that it will be useful,
-  * but WITHOUT ANY WARRANTY; without even the implied warranty of
-@@ -17,8 +17,6 @@
-  * along with this program; if not, you can access it online at
-  * http://www.gnu.org/licenses/gpl-2.0.html.
-  *
-- * SPDX-License-Identifier: GPL-2.0
-- *
-  */
- 
- /*
-@@ -32,12 +30,18 @@
- #include <mali_kbase_pm.h>
- #include <mali_kbase_config_defaults.h>
- #include <mali_kbase_smc.h>
-+
-+#if MALI_USE_CSF
-+#include <csf/ipa_control/mali_kbase_csf_ipa_control.h>
-+#else
- #include <mali_kbase_hwaccess_jm.h>
-+#endif /* !MALI_USE_CSF */
-+
- #include <mali_kbase_reset_gpu.h>
- #include <mali_kbase_ctx_sched.h>
- #include <mali_kbase_hwcnt_context.h>
- #include <backend/gpu/mali_kbase_cache_policy_backend.h>
--#include <backend/gpu/mali_kbase_device_internal.h>
-+#include <device/mali_kbase_device.h>
- #include <backend/gpu/mali_kbase_irq_internal.h>
- #include <backend/gpu/mali_kbase_pm_internal.h>
- #include <backend/gpu/mali_kbase_l2_mmu_config.h>
-@@ -45,6 +49,9 @@
- #ifdef CONFIG_MALI_ARBITER_SUPPORT
- #include <arbiter/mali_kbase_arbiter_pm.h>
- #endif /* CONFIG_MALI_ARBITER_SUPPORT */
-+#if MALI_USE_CSF
-+#include <csf/ipa_control/mali_kbase_csf_ipa_control.h>
-+#endif
- 
- #include <linux/of.h>
- 
-@@ -89,6 +96,28 @@ static u64 kbase_pm_get_state(
- 		enum kbase_pm_core_type core_type,
- 		enum kbasep_pm_action action);
- 
-+#if MALI_USE_CSF
-+bool kbase_pm_is_mcu_desired(struct kbase_device *kbdev)
-+{
-+	lockdep_assert_held(&kbdev->hwaccess_lock);
-+
-+	if (unlikely(!kbdev->csf.firmware_inited))
-+		return false;
-+
-+	if (kbdev->csf.scheduler.pm_active_count)
-+		return true;
-+
-+	/* MCU is supposed to be ON, only when scheduler.pm_active_count is
-+	 * non zero. But for always_on policy, the MCU needs to be kept on,
-+	 * unless policy changing transition needs it off.
-+	 */
-+
-+	return (kbdev->pm.backend.mcu_desired &&
-+		kbase_pm_no_mcu_core_pwroff(kbdev) &&
-+		!kbdev->pm.backend.policy_change_clamp_state_to_off);
-+}
-+#endif
-+
- bool kbase_pm_is_l2_desired(struct kbase_device *kbdev)
- {
- 	if (kbdev->pm.backend.protected_entry_transition_override)
-@@ -102,6 +131,11 @@ bool kbase_pm_is_l2_desired(struct kbase_device *kbdev)
- 			!kbdev->pm.backend.shaders_desired)
- 		return false;
- 
-+#if MALI_USE_CSF
-+	if (kbdev->pm.backend.policy_change_clamp_state_to_off)
-+		return false;
-+#endif
-+
- 	return kbdev->pm.backend.l2_desired;
- }
- 
-@@ -210,7 +244,7 @@ static u32 core_type_to_reg(enum kbase_pm_core_type core_type,
- 	return (u32)core_type + (u32)action;
- }
- 
--#ifdef CONFIG_ARM64
-+#if IS_ENABLED(CONFIG_ARM64)
- static void mali_cci_flush_l2(struct kbase_device *kbdev)
- {
- 	const u32 mask = CLEAN_CACHES_COMPLETED | RESET_COMPLETED;
-@@ -233,7 +267,8 @@ static void mali_cci_flush_l2(struct kbase_device *kbdev)
- 		GPU_CONTROL_REG(GPU_IRQ_RAWSTAT));
- 
- 	/* Wait for cache flush to complete before continuing, exit on
--	 * gpu resets or loop expiry. */
-+	 * gpu resets or loop expiry.
-+	 */
- 	while (((raw & mask) == 0) && --loops) {
- 		raw = kbase_reg_read(kbdev,
- 					GPU_CONTROL_REG(GPU_IRQ_RAWSTAT));
-@@ -372,9 +407,9 @@ u64 kbase_pm_get_present_cores(struct kbase_device *kbdev,
- 
- 	switch (type) {
- 	case KBASE_PM_CORE_L2:
--		return kbdev->gpu_props.props.raw_props.l2_present;
-+		return kbdev->gpu_props.curr_config.l2_present;
- 	case KBASE_PM_CORE_SHADER:
--		return kbdev->gpu_props.props.raw_props.shader_present;
-+		return kbdev->gpu_props.curr_config.shader_present;
- 	case KBASE_PM_CORE_TILER:
- 		return kbdev->gpu_props.props.raw_props.tiler_present;
- 	case KBASE_PM_CORE_STACK:
-@@ -468,14 +503,10 @@ static void kbase_pm_trigger_hwcnt_disable(struct kbase_device *kbdev)
- 	 */
- 	if (kbase_hwcnt_context_disable_atomic(kbdev->hwcnt_gpu_ctx)) {
- 		backend->hwcnt_disabled = true;
-+
- 	} else {
--#if KERNEL_VERSION(3, 16, 0) > LINUX_VERSION_CODE
--		queue_work(system_wq,
--			&backend->hwcnt_disable_work);
--#else
--		queue_work(system_highpri_wq,
--			&backend->hwcnt_disable_work);
--#endif
-+		kbase_hwcnt_context_queue_work(kbdev->hwcnt_gpu_ctx,
-+					       &backend->hwcnt_disable_work);
- 	}
- }
- 
-@@ -493,7 +524,8 @@ static void kbase_pm_l2_config_override(struct kbase_device *kbdev)
- 	 * Skip if size and hash are not given explicitly,
- 	 * which means default values are used.
- 	 */
--	if ((kbdev->l2_size_override == 0) && (kbdev->l2_hash_override == 0))
-+	if ((kbdev->l2_size_override == 0) && (kbdev->l2_hash_override == 0) &&
-+	    (!kbdev->l2_hash_values_override))
- 		return;
- 
- 	val = kbase_reg_read(kbdev, GPU_CONTROL_REG(L2_CONFIG));
-@@ -504,13 +536,25 @@ static void kbase_pm_l2_config_override(struct kbase_device *kbdev)
- 	}
- 
- 	if (kbdev->l2_hash_override) {
-+		WARN_ON(kbase_hw_has_feature(kbdev, BASE_HW_FEATURE_ASN_HASH));
- 		val &= ~L2_CONFIG_HASH_MASK;
- 		val |= (kbdev->l2_hash_override << L2_CONFIG_HASH_SHIFT);
-+	} else if (kbdev->l2_hash_values_override) {
-+		int i;
-+
-+		WARN_ON(!kbase_hw_has_feature(kbdev, BASE_HW_FEATURE_ASN_HASH));
-+		val &= ~L2_CONFIG_ASN_HASH_ENABLE_MASK;
-+		val |= (0x1 << L2_CONFIG_ASN_HASH_ENABLE_SHIFT);
-+
-+		for (i = 0; i < ASN_HASH_COUNT; i++) {
-+			dev_dbg(kbdev->dev, "Program 0x%x to ASN_HASH[%d]\n",
-+				kbdev->l2_hash_values[i], i);
-+			kbase_reg_write(kbdev, GPU_CONTROL_REG(ASN_HASH(i)),
-+					kbdev->l2_hash_values[i]);
-+		}
- 	}
- 
- 	dev_dbg(kbdev->dev, "Program 0x%x to L2_CONFIG\n", val);
--
--	/* Write L2_CONFIG to override */
- 	kbase_reg_write(kbdev, GPU_CONTROL_REG(L2_CONFIG), val);
- }
- 
-@@ -523,6 +567,278 @@ static void kbase_pm_control_gpu_clock(struct kbase_device *kbdev)
- 	queue_work(system_wq, &backend->gpu_clock_control_work);
- }
- 
-+#if MALI_USE_CSF
-+static const char *kbase_mcu_state_to_string(enum kbase_mcu_state state)
-+{
-+	const char *const strings[] = {
-+#define KBASEP_MCU_STATE(n) #n,
-+#include "mali_kbase_pm_mcu_states.h"
-+#undef KBASEP_MCU_STATE
-+	};
-+	if (WARN_ON((size_t)state >= ARRAY_SIZE(strings)))
-+		return "Bad MCU state";
-+	else
-+		return strings[state];
-+}
-+
-+static inline bool kbase_pm_handle_mcu_core_attr_update(struct kbase_device *kbdev)
-+{
-+	struct kbase_pm_backend_data *backend = &kbdev->pm.backend;
-+	bool timer_update;
-+	bool core_mask_update;
-+
-+	lockdep_assert_held(&kbdev->hwaccess_lock);
-+
-+	WARN_ON(backend->mcu_state != KBASE_MCU_ON);
-+
-+	/* This function is only for cases where the MCU managing Cores, if
-+	 * the firmware mode is with host control, do nothing here.
-+	 */
-+	if (unlikely(kbdev->csf.firmware_hctl_core_pwr))
-+		return false;
-+
-+	core_mask_update =
-+		backend->shaders_avail != backend->shaders_desired_mask;
-+
-+	timer_update = kbdev->csf.mcu_core_pwroff_dur_count !=
-+			kbdev->csf.mcu_core_pwroff_reg_shadow;
-+
-+	if (core_mask_update || timer_update)
-+		kbase_csf_firmware_update_core_attr(kbdev, timer_update,
-+			core_mask_update, backend->shaders_desired_mask);
-+
-+	return (core_mask_update || timer_update);
-+}
-+
-+static int kbase_pm_mcu_update_state(struct kbase_device *kbdev)
-+{
-+	struct kbase_pm_backend_data *backend = &kbdev->pm.backend;
-+	enum kbase_mcu_state prev_state;
-+
-+	lockdep_assert_held(&kbdev->hwaccess_lock);
-+
-+	/*
-+	 * Initial load of firmare should have been done to
-+	 * exercise the MCU state machine.
-+	 */
-+	if (unlikely(!kbdev->csf.firmware_inited)) {
-+		WARN_ON(backend->mcu_state != KBASE_MCU_OFF);
-+		return -EIO;
-+	}
-+
-+	do {
-+		u64 shaders_trans = kbase_pm_get_trans_cores(kbdev, KBASE_PM_CORE_SHADER);
-+		u64 shaders_ready = kbase_pm_get_ready_cores(kbdev, KBASE_PM_CORE_SHADER);
-+
-+		/* mask off ready from trans in case transitions finished
-+		 * between the register reads
-+		 */
-+		shaders_trans &= ~shaders_ready;
-+
-+		prev_state = backend->mcu_state;
-+
-+		switch (backend->mcu_state) {
-+		case KBASE_MCU_OFF:
-+			if (kbase_pm_is_mcu_desired(kbdev) &&
-+			    !backend->policy_change_clamp_state_to_off &&
-+			    backend->l2_state == KBASE_L2_ON) {
-+				kbase_csf_firmware_trigger_reload(kbdev);
-+				backend->mcu_state = KBASE_MCU_PEND_ON_RELOAD;
-+			}
-+			break;
-+
-+		case KBASE_MCU_PEND_ON_RELOAD:
-+			if (kbdev->csf.firmware_reloaded) {
-+				backend->shaders_desired_mask =
-+					kbase_pm_ca_get_core_mask(kbdev);
-+				kbase_csf_firmware_global_reinit(kbdev,
-+					backend->shaders_desired_mask);
-+				backend->mcu_state =
-+					KBASE_MCU_ON_GLB_REINIT_PEND;
-+			}
-+			break;
-+
-+		case KBASE_MCU_ON_GLB_REINIT_PEND:
-+			if (kbase_csf_firmware_global_reinit_complete(kbdev)) {
-+				backend->shaders_avail =
-+						backend->shaders_desired_mask;
-+				backend->pm_shaders_core_mask = 0;
-+				if (kbdev->csf.firmware_hctl_core_pwr) {
-+					kbase_pm_invoke(kbdev, KBASE_PM_CORE_SHADER,
-+						backend->shaders_avail, ACTION_PWRON);
-+					backend->mcu_state =
-+						KBASE_MCU_HCTL_SHADERS_PEND_ON;
-+				} else
-+					backend->mcu_state = KBASE_MCU_ON_HWCNT_ENABLE;
-+			}
-+			break;
-+
-+		case KBASE_MCU_HCTL_SHADERS_PEND_ON:
-+			if (!shaders_trans &&
-+			    shaders_ready == backend->shaders_avail) {
-+				/* Cores now stable, notify MCU the stable mask */
-+				kbase_csf_firmware_update_core_attr(kbdev,
-+						false, true, shaders_ready);
-+
-+				backend->pm_shaders_core_mask = shaders_ready;
-+				backend->mcu_state =
-+					KBASE_MCU_HCTL_CORES_NOTIFY_PEND;
-+			}
-+			break;
-+
-+		case KBASE_MCU_HCTL_CORES_NOTIFY_PEND:
-+			/* Wait for the acknowledgement */
-+			if (kbase_csf_firmware_core_attr_updated(kbdev))
-+				backend->mcu_state = KBASE_MCU_ON_HWCNT_ENABLE;
-+			break;
-+
-+		case KBASE_MCU_ON_HWCNT_ENABLE:
-+			backend->hwcnt_desired = true;
-+			if (backend->hwcnt_disabled) {
-+				unsigned long flags;
-+
-+				kbase_csf_scheduler_spin_lock(kbdev, &flags);
-+				kbase_hwcnt_context_enable(
-+					kbdev->hwcnt_gpu_ctx);
-+				kbase_csf_scheduler_spin_unlock(kbdev, flags);
-+				backend->hwcnt_disabled = false;
-+			}
-+			backend->mcu_state = KBASE_MCU_ON;
-+			break;
-+
-+		case KBASE_MCU_ON:
-+			backend->shaders_desired_mask = kbase_pm_ca_get_core_mask(kbdev);
-+
-+			if (!kbase_pm_is_mcu_desired(kbdev))
-+				backend->mcu_state = KBASE_MCU_ON_HWCNT_DISABLE;
-+			else if (kbdev->csf.firmware_hctl_core_pwr) {
-+				/* Host control add additional Cores to be active */
-+				if (backend->shaders_desired_mask & ~shaders_ready) {
-+					backend->hwcnt_desired = false;
-+					if (!backend->hwcnt_disabled)
-+						kbase_pm_trigger_hwcnt_disable(kbdev);
-+					backend->mcu_state =
-+						KBASE_MCU_HCTL_MCU_ON_RECHECK;
-+				}
-+			} else if (kbase_pm_handle_mcu_core_attr_update(kbdev))
-+				kbdev->pm.backend.mcu_state =
-+					KBASE_MCU_ON_CORE_ATTR_UPDATE_PEND;
-+			break;
-+
-+		case KBASE_MCU_HCTL_MCU_ON_RECHECK:
-+			backend->shaders_desired_mask = kbase_pm_ca_get_core_mask(kbdev);
-+
-+			if (!backend->hwcnt_disabled) {
-+				/* Wait for being disabled */
-+				;
-+			} else if (!kbase_pm_is_mcu_desired(kbdev)) {
-+				/* Converging to MCU powering down flow */
-+				backend->mcu_state = KBASE_MCU_ON_HWCNT_DISABLE;
-+			} else if (backend->shaders_desired_mask & ~shaders_ready) {
-+				/* set cores ready but not available to
-+				 * meet SHADERS_PEND_ON check pass
-+				 */
-+				backend->shaders_avail =
-+					(backend->shaders_desired_mask | shaders_ready);
-+
-+				kbase_pm_invoke(kbdev, KBASE_PM_CORE_SHADER,
-+						backend->shaders_avail & ~shaders_ready,
-+						ACTION_PWRON);
-+				backend->mcu_state =
-+					KBASE_MCU_HCTL_SHADERS_PEND_ON;
-+			} else {
-+				backend->mcu_state =
-+					KBASE_MCU_HCTL_SHADERS_PEND_ON;
-+			}
-+			break;
-+
-+		case KBASE_MCU_ON_CORE_ATTR_UPDATE_PEND:
-+			if (kbase_csf_firmware_core_attr_updated(kbdev)) {
-+				backend->shaders_avail =
-+					backend->shaders_desired_mask;
-+				backend->mcu_state = KBASE_MCU_ON;
-+			}
-+			break;
-+
-+		case KBASE_MCU_ON_HWCNT_DISABLE:
-+			if (kbase_pm_is_mcu_desired(kbdev)) {
-+				backend->mcu_state = KBASE_MCU_ON_HWCNT_ENABLE;
-+				break;
-+			}
-+
-+			backend->hwcnt_desired = false;
-+			if (!backend->hwcnt_disabled)
-+				kbase_pm_trigger_hwcnt_disable(kbdev);
-+
-+			if (backend->hwcnt_disabled)
-+				backend->mcu_state = KBASE_MCU_ON_HALT;
-+			break;
-+
-+		case KBASE_MCU_ON_HALT:
-+			if (!kbase_pm_is_mcu_desired(kbdev)) {
-+				kbase_csf_firmware_trigger_mcu_halt(kbdev);
-+				backend->mcu_state = KBASE_MCU_ON_PEND_HALT;
-+			} else
-+				backend->mcu_state = KBASE_MCU_ON_HWCNT_ENABLE;
-+			break;
-+
-+		case KBASE_MCU_ON_PEND_HALT:
-+			if (kbase_csf_firmware_mcu_halted(kbdev)) {
-+				if (kbdev->csf.firmware_hctl_core_pwr)
-+					backend->mcu_state =
-+						KBASE_MCU_HCTL_SHADERS_READY_OFF;
-+				else
-+					backend->mcu_state = KBASE_MCU_POWER_DOWN;
-+			}
-+			break;
-+
-+		case KBASE_MCU_HCTL_SHADERS_READY_OFF:
-+			kbase_pm_invoke(kbdev, KBASE_PM_CORE_SHADER,
-+					shaders_ready, ACTION_PWROFF);
-+			backend->mcu_state =
-+				KBASE_MCU_HCTL_SHADERS_PEND_OFF;
-+			break;
-+
-+		case KBASE_MCU_HCTL_SHADERS_PEND_OFF:
-+			if (!shaders_trans && !shaders_ready) {
-+				backend->pm_shaders_core_mask = 0;
-+				backend->mcu_state = KBASE_MCU_POWER_DOWN;
-+			}
-+			break;
-+
-+		case KBASE_MCU_POWER_DOWN:
-+			kbase_csf_firmware_disable_mcu(kbdev);
-+			backend->mcu_state = KBASE_MCU_PEND_OFF;
-+			break;
-+
-+		case KBASE_MCU_PEND_OFF:
-+			/* wait synchronously for the MCU to get disabled */
-+			kbase_csf_firmware_disable_mcu_wait(kbdev);
-+			backend->mcu_state = KBASE_MCU_OFF;
-+			break;
-+
-+		case KBASE_MCU_RESET_WAIT:
-+			/* Reset complete  */
-+			if (!backend->in_reset)
-+				backend->mcu_state = KBASE_MCU_OFF;
-+			break;
-+
-+		default:
-+			WARN(1, "Invalid state in mcu_state: %d",
-+			     backend->mcu_state);
-+		}
-+
-+		if (backend->mcu_state != prev_state)
-+			dev_dbg(kbdev->dev, "MCU state transition: %s to %s\n",
-+				kbase_mcu_state_to_string(prev_state),
-+				kbase_mcu_state_to_string(backend->mcu_state));
-+
-+	} while (backend->mcu_state != prev_state);
-+
-+	return 0;
-+}
-+#endif
-+
- static const char *kbase_l2_core_state_to_string(enum kbase_l2_core_state state)
- {
- 	const char *const strings[] = {
-@@ -539,8 +855,10 @@ static const char *kbase_l2_core_state_to_string(enum kbase_l2_core_state state)
- static int kbase_pm_l2_update_state(struct kbase_device *kbdev)
- {
- 	struct kbase_pm_backend_data *backend = &kbdev->pm.backend;
--	u64 l2_present = kbdev->gpu_props.props.raw_props.l2_present;
-+	u64 l2_present = kbdev->gpu_props.curr_config.l2_present;
-+#if !MALI_USE_CSF
- 	u64 tiler_present = kbdev->gpu_props.props.raw_props.tiler_present;
-+#endif
- 	enum kbase_l2_core_state prev_state;
- 
- 	lockdep_assert_held(&kbdev->hwaccess_lock);
-@@ -551,35 +869,49 @@ static int kbase_pm_l2_update_state(struct kbase_device *kbdev)
- 				KBASE_PM_CORE_L2);
- 		u64 l2_ready = kbase_pm_get_ready_cores(kbdev,
- 				KBASE_PM_CORE_L2);
-+
-+#if !MALI_USE_CSF
- 		u64 tiler_trans = kbase_pm_get_trans_cores(kbdev,
- 				KBASE_PM_CORE_TILER);
- 		u64 tiler_ready = kbase_pm_get_ready_cores(kbdev,
- 				KBASE_PM_CORE_TILER);
-+#endif
- 
- 		/*
- 		 * kbase_pm_get_ready_cores and kbase_pm_get_trans_cores
- 		 * are vulnerable to corruption if gpu is lost
- 		 */
--		if (kbase_is_gpu_lost(kbdev))
--			return -EIO;
-+		if (kbase_is_gpu_removed(kbdev)
-+#ifdef CONFIG_MALI_ARBITER_SUPPORT
-+				|| kbase_pm_is_gpu_lost(kbdev)) {
-+#else
-+				) {
-+#endif
-+			backend->shaders_state =
-+				KBASE_SHADERS_OFF_CORESTACK_OFF;
-+			backend->l2_state = KBASE_L2_OFF;
-+			dev_dbg(kbdev->dev, "GPU lost has occurred - L2 off\n");
-+			break;
-+		}
- 
- 		/* mask off ready from trans in case transitions finished
- 		 * between the register reads
- 		 */
- 		l2_trans &= ~l2_ready;
-+#if !MALI_USE_CSF
- 		tiler_trans &= ~tiler_ready;
--
-+#endif
- 		prev_state = backend->l2_state;
- 
- 		switch (backend->l2_state) {
- 		case KBASE_L2_OFF:
- 			if (kbase_pm_is_l2_desired(kbdev)) {
- 				/*
--				 * Set the desired config for L2 before powering
--				 * it on
-+				 * Set the desired config for L2 before
-+				 * powering it on
- 				 */
- 				kbase_pm_l2_config_override(kbdev);
--
-+#if !MALI_USE_CSF
- 				/* L2 is required, power on.  Powering on the
- 				 * tiler will also power the first L2 cache.
- 				 */
-@@ -593,14 +925,30 @@ static int kbase_pm_l2_update_state(struct kbase_device *kbdev)
- 					kbase_pm_invoke(kbdev, KBASE_PM_CORE_L2,
- 							l2_present & ~1,
- 							ACTION_PWRON);
-+#else
-+				/* With CSF firmware, Host driver doesn't need to
-+				 * handle power management with both shader and tiler cores.
-+				 * The CSF firmware will power up the cores appropriately.
-+				 * So only power the l2 cache explicitly.
-+				 */
-+				kbase_pm_invoke(kbdev, KBASE_PM_CORE_L2,
-+						l2_present, ACTION_PWRON);
-+#endif
- 				backend->l2_state = KBASE_L2_PEND_ON;
- 			}
- 			break;
- 
- 		case KBASE_L2_PEND_ON:
-+#if !MALI_USE_CSF
- 			if (!l2_trans && l2_ready == l2_present && !tiler_trans
- 					&& tiler_ready == tiler_present) {
--				KBASE_KTRACE_ADD(kbdev, PM_CORES_CHANGE_AVAILABLE_TILER, NULL, tiler_ready);
-+				KBASE_KTRACE_ADD(kbdev, PM_CORES_CHANGE_AVAILABLE_TILER, NULL,
-+						tiler_ready);
-+#else
-+			if (!l2_trans && l2_ready == l2_present) {
-+				KBASE_KTRACE_ADD(kbdev, PM_CORES_CHANGE_AVAILABLE_L2, NULL,
-+						l2_ready);
-+#endif
- 				/*
- 				 * Ensure snoops are enabled after L2 is powered
- 				 * up. Note that kbase keeps track of the snoop
-@@ -658,22 +1006,30 @@ static int kbase_pm_l2_update_state(struct kbase_device *kbdev)
- 			break;
- 
- 		case KBASE_L2_ON_HWCNT_ENABLE:
-+#if !MALI_USE_CSF
- 			backend->hwcnt_desired = true;
- 			if (backend->hwcnt_disabled) {
- 				kbase_hwcnt_context_enable(
- 					kbdev->hwcnt_gpu_ctx);
- 				backend->hwcnt_disabled = false;
- 			}
-+#endif
- 			backend->l2_state = KBASE_L2_ON;
- 			break;
- 
- 		case KBASE_L2_ON:
- 			if (!kbase_pm_is_l2_desired(kbdev)) {
-+#if !MALI_USE_CSF
- 				/* Do not power off L2 until the shaders and
- 				 * core stacks are off.
- 				 */
- 				if (backend->shaders_state != KBASE_SHADERS_OFF_CORESTACK_OFF)
- 					break;
-+#else
-+				/* Do not power off L2 until the MCU has been stopped */
-+				if (backend->mcu_state != KBASE_MCU_OFF)
-+					break;
-+#endif
- 
- 				/* We need to make sure hardware counters are
- 				 * disabled before powering down the L2, to
-@@ -690,6 +1046,7 @@ static int kbase_pm_l2_update_state(struct kbase_device *kbdev)
- 			break;
- 
- 		case KBASE_L2_ON_HWCNT_DISABLE:
-+#if !MALI_USE_CSF
- 			/* If the L2 became desired while we were waiting on the
- 			 * worker to do the actual hwcnt disable (which might
- 			 * happen if some work was submitted immediately after
-@@ -719,6 +1076,7 @@ static int kbase_pm_l2_update_state(struct kbase_device *kbdev)
- 			if (!backend->hwcnt_disabled) {
- 				kbase_pm_trigger_hwcnt_disable(kbdev);
- 			}
-+#endif
- 
- 			if (backend->hwcnt_disabled) {
- 				if (kbdev->pm.backend.gpu_clock_slow_down_wa)
-@@ -769,9 +1127,11 @@ static int kbase_pm_l2_update_state(struct kbase_device *kbdev)
- 				 */
- 				kbase_gpu_start_cache_clean_nolock(
- 						kbdev);
--
-+#if !MALI_USE_CSF
- 			KBASE_KTRACE_ADD(kbdev, PM_CORES_CHANGE_AVAILABLE_TILER, NULL, 0u);
--
-+#else
-+			KBASE_KTRACE_ADD(kbdev, PM_CORES_CHANGE_AVAILABLE_L2, NULL, 0u);
-+#endif
- 			backend->l2_state = KBASE_L2_PEND_OFF;
- 			break;
- 
-@@ -877,6 +1237,7 @@ static void shader_poweroff_timer_queue_cancel(struct kbase_device *kbdev)
- 	}
- }
- 
-+#if !MALI_USE_CSF
- static const char *kbase_shader_core_state_to_string(
- 	enum kbase_shader_core_state state)
- {
-@@ -898,7 +1259,6 @@ static int kbase_pm_shaders_update_state(struct kbase_device *kbdev)
- 			&kbdev->pm.backend.shader_tick_timer;
- 	enum kbase_shader_core_state prev_state;
- 	u64 stacks_avail = 0;
--	int err = 0;
- 
- 	lockdep_assert_held(&kbdev->hwaccess_lock);
- 
-@@ -924,8 +1284,15 @@ static int kbase_pm_shaders_update_state(struct kbase_device *kbdev)
- 		 * kbase_pm_get_ready_cores and kbase_pm_get_trans_cores
- 		 * are vulnerable to corruption if gpu is lost
- 		 */
--		if (kbase_is_gpu_lost(kbdev)) {
--			err = -EIO;
-+		if (kbase_is_gpu_removed(kbdev)
-+#ifdef CONFIG_MALI_ARBITER_SUPPORT
-+				|| kbase_pm_is_gpu_lost(kbdev)) {
-+#else
-+				) {
-+#endif
-+			backend->shaders_state =
-+				KBASE_SHADERS_OFF_CORESTACK_OFF;
-+			dev_dbg(kbdev->dev, "GPU lost has occurred - shaders off\n");
- 			break;
- 		}
- 
-@@ -976,6 +1343,12 @@ static int kbase_pm_shaders_update_state(struct kbase_device *kbdev)
- 				kbase_pm_invoke(kbdev, KBASE_PM_CORE_SHADER,
- 						backend->shaders_avail, ACTION_PWRON);
- 
-+				if (backend->pm_current_policy &&
-+				    backend->pm_current_policy->handle_event)
-+					backend->pm_current_policy->handle_event(
-+						kbdev,
-+						KBASE_PM_POLICY_EVENT_POWER_ON);
-+
- 				backend->shaders_state = KBASE_SHADERS_PEND_ON_CORESTACK_ON;
- 			}
- 			break;
-@@ -986,8 +1359,18 @@ static int kbase_pm_shaders_update_state(struct kbase_device *kbdev)
- 				backend->pm_shaders_core_mask = shaders_ready;
- 				backend->hwcnt_desired = true;
- 				if (backend->hwcnt_disabled) {
-+#if MALI_USE_CSF
-+					unsigned long flags;
-+
-+					kbase_csf_scheduler_spin_lock(kbdev,
-+								      &flags);
-+#endif
- 					kbase_hwcnt_context_enable(
- 						kbdev->hwcnt_gpu_ctx);
-+#if MALI_USE_CSF
-+					kbase_csf_scheduler_spin_unlock(kbdev,
-+									flags);
-+#endif
- 					backend->hwcnt_disabled = false;
- 				}
- 
-@@ -1018,6 +1401,12 @@ static int kbase_pm_shaders_update_state(struct kbase_device *kbdev)
- 				/* Wait for being disabled */
- 				;
- 			} else if (!backend->shaders_desired) {
-+				if (backend->pm_current_policy &&
-+				    backend->pm_current_policy->handle_event)
-+					backend->pm_current_policy->handle_event(
-+						kbdev,
-+						KBASE_PM_POLICY_EVENT_IDLE);
-+
- 				if (kbdev->pm.backend.protected_transition_override ||
- #ifdef CONFIG_MALI_ARBITER_SUPPORT
- 						kbase_pm_is_suspending(kbdev) ||
-@@ -1078,9 +1467,21 @@ static int kbase_pm_shaders_update_state(struct kbase_device *kbdev)
- 			}
- 
- 			if (backend->shaders_desired) {
-+				if (backend->pm_current_policy &&
-+				    backend->pm_current_policy->handle_event)
-+					backend->pm_current_policy->handle_event(
-+						kbdev,
-+						KBASE_PM_POLICY_EVENT_TIMER_HIT);
-+
- 				stt->remaining_ticks = 0;
- 				backend->shaders_state = KBASE_SHADERS_ON_CORESTACK_ON_RECHECK;
- 			} else if (stt->remaining_ticks == 0) {
-+				if (backend->pm_current_policy &&
-+				    backend->pm_current_policy->handle_event)
-+					backend->pm_current_policy->handle_event(
-+						kbdev,
-+						KBASE_PM_POLICY_EVENT_TIMER_MISS);
-+
- 				backend->shaders_state = KBASE_SHADERS_WAIT_FINISHED_CORESTACK_ON;
- #ifdef CONFIG_MALI_ARBITER_SUPPORT
- 			} else if (kbase_pm_is_suspending(kbdev) ||
-@@ -1167,8 +1568,18 @@ static int kbase_pm_shaders_update_state(struct kbase_device *kbdev)
- 				backend->pm_shaders_core_mask = 0;
- 				backend->hwcnt_desired = true;
- 				if (backend->hwcnt_disabled) {
-+#if MALI_USE_CSF
-+					unsigned long flags;
-+
-+					kbase_csf_scheduler_spin_lock(kbdev,
-+								      &flags);
-+#endif
- 					kbase_hwcnt_context_enable(
- 						kbdev->hwcnt_gpu_ctx);
-+#if MALI_USE_CSF
-+					kbase_csf_scheduler_spin_unlock(kbdev,
-+									flags);
-+#endif
- 					backend->hwcnt_disabled = false;
- 				}
- 				backend->shaders_state = KBASE_SHADERS_OFF_CORESTACK_OFF_TIMER_PEND_OFF;
-@@ -1195,8 +1606,9 @@ static int kbase_pm_shaders_update_state(struct kbase_device *kbdev)
- 
- 	} while (backend->shaders_state != prev_state);
- 
--	return err;
-+	return 0;
- }
-+#endif
- 
- static bool kbase_pm_is_in_desired_state_nolock(struct kbase_device *kbdev)
- {
-@@ -1211,12 +1623,21 @@ static bool kbase_pm_is_in_desired_state_nolock(struct kbase_device *kbdev)
- 			kbdev->pm.backend.l2_state != KBASE_L2_OFF)
- 		in_desired_state = false;
- 
-+#if !MALI_USE_CSF
- 	if (kbdev->pm.backend.shaders_desired &&
- 			kbdev->pm.backend.shaders_state != KBASE_SHADERS_ON_CORESTACK_ON)
- 		in_desired_state = false;
- 	else if (!kbdev->pm.backend.shaders_desired &&
- 			kbdev->pm.backend.shaders_state != KBASE_SHADERS_OFF_CORESTACK_OFF)
- 		in_desired_state = false;
-+#else
-+	if (kbase_pm_is_mcu_desired(kbdev) &&
-+	    kbdev->pm.backend.mcu_state != KBASE_MCU_ON)
-+		in_desired_state = false;
-+	else if (!kbase_pm_is_mcu_desired(kbdev) &&
-+		 kbdev->pm.backend.mcu_state != KBASE_MCU_OFF)
-+		in_desired_state = false;
-+#endif
- 
- 	return in_desired_state;
- }
-@@ -1280,17 +1701,22 @@ static void kbase_pm_trace_power_state(struct kbase_device *kbdev)
- 
- void kbase_pm_update_state(struct kbase_device *kbdev)
- {
-+#if !MALI_USE_CSF
- 	enum kbase_shader_core_state prev_shaders_state =
- 			kbdev->pm.backend.shaders_state;
-+#else
-+	enum kbase_mcu_state prev_mcu_state = kbdev->pm.backend.mcu_state;
-+#endif
- 
- 	lockdep_assert_held(&kbdev->hwaccess_lock);
- 
--	if (!kbdev->pm.backend.gpu_powered)
--		return; /* Do nothing if the GPU is off */
-+	if (!kbdev->pm.backend.gpu_ready)
-+		return; /* Do nothing if the GPU is not ready */
- 
- 	if (kbase_pm_l2_update_state(kbdev))
- 		return;
- 
-+#if !MALI_USE_CSF
- 	if (kbase_pm_shaders_update_state(kbdev))
- 		return;
- 
-@@ -1304,9 +1730,20 @@ void kbase_pm_update_state(struct kbase_device *kbdev)
- 		if (kbase_pm_l2_update_state(kbdev))
- 			return;
- 		}
-+#else
-+	if (kbase_pm_mcu_update_state(kbdev))
-+		return;
-+
-+	if (prev_mcu_state != KBASE_MCU_OFF &&
-+	    kbdev->pm.backend.mcu_state == KBASE_MCU_OFF) {
-+		if (kbase_pm_l2_update_state(kbdev))
-+			return;
-+	}
-+#endif
- 
- 	if (kbase_pm_is_in_desired_state_nolock(kbdev)) {
--		KBASE_KTRACE_ADD(kbdev, PM_DESIRED_REACHED, NULL, kbdev->pm.backend.shaders_avail);
-+		KBASE_KTRACE_ADD(kbdev, PM_DESIRED_REACHED, NULL,
-+				 kbdev->pm.backend.shaders_avail);
- 
- 		kbase_pm_trace_power_state(kbdev);
- 
-@@ -1363,7 +1800,8 @@ int kbase_pm_state_machine_init(struct kbase_device *kbdev)
- 	hrtimer_init(&stt->timer, CLOCK_MONOTONIC, HRTIMER_MODE_REL);
- 	stt->timer.function = shader_tick_timer_callback;
- 	stt->configured_interval = HR_TIMER_DELAY_NSEC(DEFAULT_PM_GPU_POWEROFF_TICK_NS);
--	stt->configured_ticks = DEFAULT_PM_POWEROFF_TICK_SHADER;
-+	stt->default_ticks = DEFAULT_PM_POWEROFF_TICK_SHADER;
-+	stt->configured_ticks = stt->default_ticks;
- 
- 	return 0;
- }
-@@ -1382,7 +1820,19 @@ void kbase_pm_reset_start_locked(struct kbase_device *kbdev)
- 
- 	backend->in_reset = true;
- 	backend->l2_state = KBASE_L2_RESET_WAIT;
-+#if !MALI_USE_CSF
- 	backend->shaders_state = KBASE_SHADERS_RESET_WAIT;
-+#else
-+	/* MCU state machine is exercised only after the initial load/boot
-+	 * of the firmware.
-+	 */
-+	if (likely(kbdev->csf.firmware_inited)) {
-+		backend->mcu_state = KBASE_MCU_RESET_WAIT;
-+		kbdev->csf.firmware_reload_needed = true;
-+	} else {
-+		WARN_ON(backend->mcu_state != KBASE_MCU_OFF);
-+	}
-+#endif
- 
- 	/* We're in a reset, so hwcnt will have been synchronously disabled by
- 	 * this function's caller as part of the reset process. We therefore
-@@ -1422,15 +1872,28 @@ void kbase_pm_reset_complete(struct kbase_device *kbdev)
- 
- /* Timeout for kbase_pm_wait_for_desired_state when wait_event_killable has
-  * aborted due to a fatal signal. If the time spent waiting has exceeded this
-- * threshold then there is most likely a hardware issue. */
--#define PM_TIMEOUT (5*HZ) /* 5s */
-+ * threshold then there is most likely a hardware issue.
-+ */
-+#define PM_TIMEOUT_MS (5000) /* 5s */
- 
- static void kbase_pm_timed_out(struct kbase_device *kbdev)
- {
-+	unsigned long flags;
-+
- 	dev_err(kbdev->dev, "Power transition timed out unexpectedly\n");
-+#if !MALI_USE_CSF
-+	CSTD_UNUSED(flags);
- 	dev_err(kbdev->dev, "Desired state :\n");
- 	dev_err(kbdev->dev, "\tShader=%016llx\n",
- 			kbdev->pm.backend.shaders_desired ? kbdev->pm.backend.shaders_avail : 0);
-+#else
-+	spin_lock_irqsave(&kbdev->hwaccess_lock, flags);
-+	dev_err(kbdev->dev, "\tMCU desired = %d\n",
-+		kbase_pm_is_mcu_desired(kbdev));
-+	dev_err(kbdev->dev, "\tMCU sw state = %d\n",
-+		kbdev->pm.backend.mcu_state);
-+	spin_unlock_irqrestore(&kbdev->hwaccess_lock, flags);
-+#endif
- 	dev_err(kbdev->dev, "Current state :\n");
- 	dev_err(kbdev->dev, "\tShader=%08x%08x\n",
- 			kbase_reg_read(kbdev,
-@@ -1447,6 +1910,10 @@ static void kbase_pm_timed_out(struct kbase_device *kbdev)
- 				GPU_CONTROL_REG(L2_READY_HI)),
- 			kbase_reg_read(kbdev,
- 				GPU_CONTROL_REG(L2_READY_LO)));
-+#if MALI_USE_CSF
-+	dev_err(kbdev->dev, "\tMCU status = %d\n",
-+		kbase_reg_read(kbdev, GPU_CONTROL_REG(MCU_STATUS)));
-+#endif
- 	dev_err(kbdev->dev, "Cores transitioning :\n");
- 	dev_err(kbdev->dev, "\tShader=%08x%08x\n",
- 			kbase_reg_read(kbdev, GPU_CONTROL_REG(
-@@ -1465,49 +1932,87 @@ static void kbase_pm_timed_out(struct kbase_device *kbdev)
- 					L2_PWRTRANS_LO)));
- 
- 	dev_err(kbdev->dev, "Sending reset to GPU - all running jobs will be lost\n");
--	if (kbase_prepare_to_reset_gpu(kbdev))
-+	if (kbase_prepare_to_reset_gpu(kbdev,
-+				       RESET_FLAGS_HWC_UNRECOVERABLE_ERROR))
- 		kbase_reset_gpu(kbdev);
- }
- 
--void kbase_pm_wait_for_l2_powered(struct kbase_device *kbdev)
-+int kbase_pm_wait_for_l2_powered(struct kbase_device *kbdev)
- {
- 	unsigned long flags;
- 	unsigned long timeout;
--	int err;
-+	long remaining;
-+	int err = 0;
- 
- 	spin_lock_irqsave(&kbdev->hwaccess_lock, flags);
- 	kbase_pm_update_state(kbdev);
- 	spin_unlock_irqrestore(&kbdev->hwaccess_lock, flags);
- 
--	timeout = jiffies + PM_TIMEOUT;
-+#if MALI_USE_CSF
-+	timeout = kbase_csf_timeout_in_jiffies(PM_TIMEOUT_MS);
-+#else
-+	timeout = msecs_to_jiffies(PM_TIMEOUT_MS);
-+#endif
- 
- 	/* Wait for cores */
--	err = wait_event_killable(kbdev->pm.backend.gpu_in_desired_state_wait,
--			kbase_pm_is_in_desired_state_with_l2_powered(kbdev));
-+#if KERNEL_VERSION(4, 13, 1) <= LINUX_VERSION_CODE
-+	remaining = wait_event_killable_timeout(
-+#else
-+	remaining = wait_event_timeout(
-+#endif
-+		kbdev->pm.backend.gpu_in_desired_state_wait,
-+		kbase_pm_is_in_desired_state_with_l2_powered(kbdev), timeout);
- 
--	if (err < 0 && time_after(jiffies, timeout))
-+	if (!remaining) {
- 		kbase_pm_timed_out(kbdev);
-+		err = -ETIMEDOUT;
-+	} else if (remaining < 0) {
-+		dev_info(
-+			kbdev->dev,
-+			"Wait for desired PM state with L2 powered got interrupted");
-+		err = (int)remaining;
-+	}
-+
-+	return err;
- }
- 
--void kbase_pm_wait_for_desired_state(struct kbase_device *kbdev)
-+int kbase_pm_wait_for_desired_state(struct kbase_device *kbdev)
- {
- 	unsigned long flags;
--	unsigned long timeout;
--	int err;
-+	long remaining;
-+#if MALI_USE_CSF
-+	long timeout = kbase_csf_timeout_in_jiffies(PM_TIMEOUT_MS);
-+#else
-+	long timeout = msecs_to_jiffies(PM_TIMEOUT_MS);
-+#endif
-+	int err = 0;
- 
- 	/* Let the state machine latch the most recent desired state. */
- 	spin_lock_irqsave(&kbdev->hwaccess_lock, flags);
- 	kbase_pm_update_state(kbdev);
- 	spin_unlock_irqrestore(&kbdev->hwaccess_lock, flags);
- 
--	timeout = jiffies + PM_TIMEOUT;
--
- 	/* Wait for cores */
--	err = wait_event_killable(kbdev->pm.backend.gpu_in_desired_state_wait,
--			kbase_pm_is_in_desired_state(kbdev));
-+#if KERNEL_VERSION(4, 13, 1) <= LINUX_VERSION_CODE
-+	remaining = wait_event_killable_timeout(
-+		kbdev->pm.backend.gpu_in_desired_state_wait,
-+		kbase_pm_is_in_desired_state(kbdev), timeout);
-+#else
-+	remaining = wait_event_timeout(
-+		kbdev->pm.backend.gpu_in_desired_state_wait,
-+		kbase_pm_is_in_desired_state(kbdev), timeout);
-+#endif
- 
--	if (err < 0 && time_after(jiffies, timeout))
-+	if (!remaining) {
- 		kbase_pm_timed_out(kbdev);
-+		err = -ETIMEDOUT;
-+	} else if (remaining < 0) {
-+		dev_info(kbdev->dev,
-+			 "Wait for desired PM state got interrupted");
-+		err = (int)remaining;
-+	}
-+
-+	return err;
- }
- KBASE_EXPORT_TEST_API(kbase_pm_wait_for_desired_state);
- 
-@@ -1515,7 +2020,7 @@ void kbase_pm_enable_interrupts(struct kbase_device *kbdev)
- {
- 	unsigned long flags;
- 
--	KBASE_DEBUG_ASSERT(NULL != kbdev);
-+	KBASE_DEBUG_ASSERT(kbdev != NULL);
- 	/*
- 	 * Clear all interrupts,
- 	 * and unmask them all.
-@@ -1529,14 +2034,19 @@ void kbase_pm_enable_interrupts(struct kbase_device *kbdev)
- 	kbase_reg_write(kbdev, JOB_CONTROL_REG(JOB_IRQ_MASK), 0xFFFFFFFF);
- 
- 	kbase_reg_write(kbdev, MMU_REG(MMU_IRQ_CLEAR), 0xFFFFFFFF);
-+#if MALI_USE_CSF
-+	/* Enable only the Page fault bits part */
-+	kbase_reg_write(kbdev, MMU_REG(MMU_IRQ_MASK), 0xFFFF);
-+#else
- 	kbase_reg_write(kbdev, MMU_REG(MMU_IRQ_MASK), 0xFFFFFFFF);
-+#endif
- }
- 
- KBASE_EXPORT_TEST_API(kbase_pm_enable_interrupts);
- 
- void kbase_pm_disable_interrupts_nolock(struct kbase_device *kbdev)
- {
--	KBASE_DEBUG_ASSERT(NULL != kbdev);
-+	KBASE_DEBUG_ASSERT(kbdev != NULL);
- 	/*
- 	 * Mask all interrupts,
- 	 * and clear them all.
-@@ -1563,6 +2073,23 @@ void kbase_pm_disable_interrupts(struct kbase_device *kbdev)
- 
- KBASE_EXPORT_TEST_API(kbase_pm_disable_interrupts);
- 
-+#if MALI_USE_CSF
-+static void update_user_reg_page_mapping(struct kbase_device *kbdev)
-+{
-+	lockdep_assert_held(&kbdev->pm.lock);
-+
-+	if (kbdev->csf.mali_file_inode) {
-+		/* This would zap the pte corresponding to the mapping of User
-+		 * register page for all the Kbase contexts.
-+		 */
-+		unmap_mapping_range(kbdev->csf.mali_file_inode->i_mapping,
-+				    BASEP_MEM_CSF_USER_REG_PAGE_HANDLE,
-+				    PAGE_SIZE, 1);
-+	}
-+}
-+#endif
-+
-+
- /*
-  * pmu layout:
-  * 0x0000: PMU TAG (RO) (0xCAFECAFE)
-@@ -1574,10 +2101,20 @@ void kbase_pm_clock_on(struct kbase_device *kbdev, bool is_resume)
- 	bool reset_required = is_resume;
- 	unsigned long flags;
- 
--	KBASE_DEBUG_ASSERT(NULL != kbdev);
-+	KBASE_DEBUG_ASSERT(kbdev != NULL);
-+#if !MALI_USE_CSF
- 	lockdep_assert_held(&kbdev->js_data.runpool_mutex);
-+#endif /* !MALI_USE_CSF */
- 	lockdep_assert_held(&kbdev->pm.lock);
- 
-+#ifdef CONFIG_MALI_ARBITER_SUPPORT
-+	if (WARN_ON(kbase_pm_is_gpu_lost(kbdev))) {
-+		dev_err(kbdev->dev,
-+			"%s: Cannot power up while GPU lost", __func__);
-+		return;
-+	}
-+#endif
-+
- 	if (kbdev->pm.backend.gpu_powered) {
- 		/* Already turned on */
- 		if (kbdev->poweroff_pending)
-@@ -1602,11 +2139,40 @@ void kbase_pm_clock_on(struct kbase_device *kbdev, bool is_resume)
- 	kbdev->pm.backend.gpu_powered = true;
- 	spin_unlock_irqrestore(&kbdev->hwaccess_lock, flags);
- 
-+#if MALI_USE_CSF
-+	/* GPU has been turned on, can switch to actual register page */
-+	update_user_reg_page_mapping(kbdev);
-+#endif
-+
- 	if (reset_required) {
- 		/* GPU state was lost, reset GPU to ensure it is in a
--		 * consistent state */
-+		 * consistent state
-+		 */
- 		kbase_pm_init_hw(kbdev, PM_ENABLE_IRQS);
- 	}
-+#ifdef CONFIG_MALI_ARBITER_SUPPORT
-+	else {
-+		if (kbdev->arb.arb_if) {
-+			struct kbase_arbiter_vm_state *arb_vm_state =
-+				kbdev->pm.arb_vm_state;
-+
-+			/* In the case that the GPU has just been granted by
-+			 * the Arbiter, a reset will have already been done.
-+			 * However, it is still necessary to initialize the GPU.
-+			 */
-+			if (arb_vm_state->vm_arb_starting)
-+				kbase_pm_init_hw(kbdev, PM_ENABLE_IRQS |
-+						PM_NO_RESET);
-+		}
-+	}
-+	/*
-+	 * This point means that the GPU trasitioned to ON. So there is a chance
-+	 * that a repartitioning occurred. In this case the current config
-+	 * should be read again.
-+	 */
-+	kbase_gpuprops_get_curr_config_props(kbdev,
-+		&kbdev->gpu_props.curr_config);
-+#endif /* CONFIG_MALI_ARBITER_SUPPORT */
- 
- 	mutex_lock(&kbdev->mmu_hw_mutex);
- 	spin_lock_irqsave(&kbdev->hwaccess_lock, flags);
-@@ -1628,7 +2194,19 @@ void kbase_pm_clock_on(struct kbase_device *kbdev, bool is_resume)
- 
- 	/* Turn on the L2 caches */
- 	spin_lock_irqsave(&kbdev->hwaccess_lock, flags);
-+	kbdev->pm.backend.gpu_ready = true;
- 	kbdev->pm.backend.l2_desired = true;
-+#if MALI_USE_CSF
-+	if (reset_required) {
-+		/* GPU reset was done after the power on, so send the post
-+		 * reset event instead. This is okay as GPU power off event
-+		 * is same as pre GPU reset event.
-+		 */
-+		kbase_ipa_control_handle_gpu_reset_post(kbdev);
-+	} else {
-+		kbase_ipa_control_handle_gpu_power_on(kbdev);
-+	}
-+#endif
- 	kbase_pm_update_state(kbdev);
- 	spin_unlock_irqrestore(&kbdev->hwaccess_lock, flags);
- }
-@@ -1639,7 +2217,7 @@ bool kbase_pm_clock_off(struct kbase_device *kbdev)
- {
- 	unsigned long flags;
- 
--	KBASE_DEBUG_ASSERT(NULL != kbdev);
-+	KBASE_DEBUG_ASSERT(kbdev != NULL);
- 	lockdep_assert_held(&kbdev->pm.lock);
- 
- 	/* ASSERT that the cores should now be unavailable. No lock needed. */
-@@ -1663,16 +2241,38 @@ bool kbase_pm_clock_off(struct kbase_device *kbdev)
- 
- 	if (atomic_read(&kbdev->faults_pending)) {
- 		/* Page/bus faults are still being processed. The GPU can not
--		 * be powered off until they have completed */
-+		 * be powered off until they have completed
-+		 */
- 		spin_unlock_irqrestore(&kbdev->hwaccess_lock, flags);
- 		return false;
- 	}
- 
- 	kbase_pm_cache_snoop_disable(kbdev);
-+#if MALI_USE_CSF
-+	kbase_ipa_control_handle_gpu_power_off(kbdev);
-+#endif
-+
-+	kbdev->pm.backend.gpu_ready = false;
- 
- 	/* The GPU power may be turned off from this point */
- 	kbdev->pm.backend.gpu_powered = false;
-+
-+#ifdef CONFIG_MALI_ARBITER_SUPPORT
-+	if (kbase_pm_is_gpu_lost(kbdev)) {
-+		/* Ensure we unblock any threads that are stuck waiting
-+		 * for the GPU
-+		 */
-+		kbase_gpu_cache_clean_wait_complete(kbdev);
-+	}
-+#endif
-+
- 	spin_unlock_irqrestore(&kbdev->hwaccess_lock, flags);
-+
-+#if MALI_USE_CSF
-+	/* GPU is about to be turned off, switch to dummy page */
-+	update_user_reg_page_mapping(kbdev);
-+#endif
-+
- #ifdef CONFIG_MALI_ARBITER_SUPPORT
- 	kbase_arbiter_pm_vm_event(kbdev, KBASE_VM_GPU_IDLE_EVENT);
- #endif /* CONFIG_MALI_ARBITER_SUPPORT */
-@@ -1720,19 +2320,23 @@ static enum hrtimer_restart kbasep_reset_timeout(struct hrtimer *timer)
- 	struct kbasep_reset_timeout_data *rtdata =
- 		container_of(timer, struct kbasep_reset_timeout_data, timer);
- 
--	rtdata->timed_out = 1;
-+	rtdata->timed_out = true;
- 
- 	/* Set the wait queue to wake up kbase_pm_init_hw even though the reset
--	 * hasn't completed */
-+	 * hasn't completed
-+	 */
- 	kbase_pm_reset_done(rtdata->kbdev);
- 
- 	return HRTIMER_NORESTART;
- }
- 
--static int kbase_set_jm_quirks(struct kbase_device *kbdev, const u32 prod_id)
-+static int kbase_set_gpu_quirks(struct kbase_device *kbdev, const u32 prod_id)
- {
--	u32 hw_quirks_jm = kbase_reg_read(kbdev,
--				GPU_CONTROL_REG(JM_CONFIG));
-+#if MALI_USE_CSF
-+	kbdev->hw_quirks_gpu =
-+		kbase_reg_read(kbdev, GPU_CONTROL_REG(CSF_CONFIG));
-+#else
-+	u32 hw_quirks_gpu = kbase_reg_read(kbdev, GPU_CONTROL_REG(JM_CONFIG));
- 
- 	if (GPU_ID2_MODEL_MATCH_VALUE(prod_id) == GPU_ID2_PRODUCT_TMIX) {
- 		/* Only for tMIx */
-@@ -1746,38 +2350,38 @@ static int kbase_set_jm_quirks(struct kbase_device *kbdev, const u32 prod_id)
- 		 */
- 		if (coherency_features ==
- 				COHERENCY_FEATURE_BIT(COHERENCY_ACE)) {
--			hw_quirks_jm |= (COHERENCY_ACE_LITE |
--					COHERENCY_ACE) <<
--					JM_FORCE_COHERENCY_FEATURES_SHIFT;
-+			hw_quirks_gpu |= (COHERENCY_ACE_LITE | COHERENCY_ACE)
-+					 << JM_FORCE_COHERENCY_FEATURES_SHIFT;
- 		}
- 	}
- 
--	if (kbase_is_gpu_lost(kbdev))
-+	if (kbase_is_gpu_removed(kbdev))
- 		return -EIO;
- 
--	kbdev->hw_quirks_jm = hw_quirks_jm;
-+	kbdev->hw_quirks_gpu = hw_quirks_gpu;
- 
-+#endif /* !MALI_USE_CSF */
- 	if (kbase_hw_has_feature(kbdev, BASE_HW_FEATURE_IDVS_GROUP_SIZE)) {
- 		int default_idvs_group_size = 0xF;
--		u32 tmp;
-+		u32 group_size = 0;
- 
--		if (of_property_read_u32(kbdev->dev->of_node,
--					"idvs-group-size", &tmp))
--			tmp = default_idvs_group_size;
-+		if (of_property_read_u32(kbdev->dev->of_node, "idvs-group-size",
-+					 &group_size))
-+			group_size = default_idvs_group_size;
- 
--		if (tmp > IDVS_GROUP_MAX_SIZE) {
-+		if (group_size > IDVS_GROUP_MAX_SIZE) {
- 			dev_err(kbdev->dev,
- 				"idvs-group-size of %d is too large. Maximum value is %d",
--				tmp, IDVS_GROUP_MAX_SIZE);
--			tmp = default_idvs_group_size;
-+				group_size, IDVS_GROUP_MAX_SIZE);
-+			group_size = default_idvs_group_size;
- 		}
- 
--		kbdev->hw_quirks_jm |= tmp << IDVS_GROUP_SIZE_SHIFT;
-+		kbdev->hw_quirks_gpu |= group_size << IDVS_GROUP_SIZE_SHIFT;
- 	}
- 
- #define MANUAL_POWER_CONTROL ((u32)(1 << 8))
- 	if (corestack_driver_control)
--		kbdev->hw_quirks_jm |= MANUAL_POWER_CONTROL;
-+		kbdev->hw_quirks_gpu |= MANUAL_POWER_CONTROL;
- 
- 	return 0;
- }
-@@ -1787,7 +2391,7 @@ static int kbase_set_sc_quirks(struct kbase_device *kbdev, const u32 prod_id)
- 	u32 hw_quirks_sc = kbase_reg_read(kbdev,
- 					GPU_CONTROL_REG(SHADER_CONFIG));
- 
--	if (kbase_is_gpu_lost(kbdev))
-+	if (kbase_is_gpu_removed(kbdev))
- 		return -EIO;
- 
- 	if (prod_id < 0x750 || prod_id == 0x6956) /* T60x, T62x, T72x */
-@@ -1811,7 +2415,7 @@ static int kbase_set_tiler_quirks(struct kbase_device *kbdev)
- 	u32 hw_quirks_tiler = kbase_reg_read(kbdev,
- 					GPU_CONTROL_REG(TILER_CONFIG));
- 
--	if (kbase_is_gpu_lost(kbdev))
-+	if (kbase_is_gpu_removed(kbdev))
- 		return -EIO;
- 
- 	/* Set tiler clock gate override if required */
-@@ -1831,18 +2435,17 @@ static int kbase_pm_hw_issues_detect(struct kbase_device *kbdev)
- 				GPU_ID_VERSION_PRODUCT_ID_SHIFT;
- 	int error = 0;
- 
--	kbdev->hw_quirks_jm = 0;
-+	kbdev->hw_quirks_gpu = 0;
- 	kbdev->hw_quirks_sc = 0;
- 	kbdev->hw_quirks_tiler = 0;
- 	kbdev->hw_quirks_mmu = 0;
- 
--	if (!of_property_read_u32(np, "quirks_jm",
--				&kbdev->hw_quirks_jm)) {
-+	if (!of_property_read_u32(np, "quirks_gpu", &kbdev->hw_quirks_gpu)) {
- 		dev_info(kbdev->dev,
--			"Found quirks_jm = [0x%x] in Devicetree\n",
--			kbdev->hw_quirks_jm);
-+			 "Found quirks_gpu = [0x%x] in Devicetree\n",
-+			 kbdev->hw_quirks_gpu);
- 	} else {
--		error = kbase_set_jm_quirks(kbdev, prod_id);
-+		error = kbase_set_gpu_quirks(kbdev, prod_id);
- 		if (error)
- 			return error;
- 	}
-@@ -1891,15 +2494,20 @@ static void kbase_pm_hw_issues_apply(struct kbase_device *kbdev)
- 
- 	kbase_reg_write(kbdev, GPU_CONTROL_REG(L2_MMU_CONFIG),
- 			kbdev->hw_quirks_mmu);
-+#if MALI_USE_CSF
-+	kbase_reg_write(kbdev, GPU_CONTROL_REG(CSF_CONFIG),
-+			kbdev->hw_quirks_gpu);
-+#else
- 	kbase_reg_write(kbdev, GPU_CONTROL_REG(JM_CONFIG),
--			kbdev->hw_quirks_jm);
-+			kbdev->hw_quirks_gpu);
-+#endif
- }
- 
- void kbase_pm_cache_snoop_enable(struct kbase_device *kbdev)
- {
- 	if ((kbdev->current_gpu_coherency_mode == COHERENCY_ACE) &&
- 		!kbdev->cci_snoop_enabled) {
--#ifdef CONFIG_ARM64
-+#if IS_ENABLED(CONFIG_ARM64)
- 		if (kbdev->snoop_enable_smc != 0)
- 			kbase_invoke_smc_fid(kbdev->snoop_enable_smc, 0, 0, 0);
- #endif /* CONFIG_ARM64 */
-@@ -1911,7 +2519,7 @@ void kbase_pm_cache_snoop_enable(struct kbase_device *kbdev)
- void kbase_pm_cache_snoop_disable(struct kbase_device *kbdev)
- {
- 	if (kbdev->cci_snoop_enabled) {
--#ifdef CONFIG_ARM64
-+#if IS_ENABLED(CONFIG_ARM64)
- 		if (kbdev->snoop_disable_smc != 0) {
- 			mali_cci_flush_l2(kbdev);
- 			kbase_invoke_smc_fid(kbdev->snoop_disable_smc, 0, 0, 0);
-@@ -1922,6 +2530,7 @@ void kbase_pm_cache_snoop_disable(struct kbase_device *kbdev)
- 	}
- }
- 
-+#if !MALI_USE_CSF
- static void reenable_protected_mode_hwcnt(struct kbase_device *kbdev)
- {
- 	unsigned long irq_flags;
-@@ -1934,6 +2543,7 @@ static void reenable_protected_mode_hwcnt(struct kbase_device *kbdev)
- 	}
- 	spin_unlock_irqrestore(&kbdev->hwaccess_lock, irq_flags);
- }
-+#endif
- 
- static int kbase_pm_do_reset(struct kbase_device *kbdev)
- {
-@@ -1960,7 +2570,7 @@ static int kbase_pm_do_reset(struct kbase_device *kbdev)
- 
- 	/* Initialize a structure for tracking the status of the reset */
- 	rtdata.kbdev = kbdev;
--	rtdata.timed_out = 0;
-+	rtdata.timed_out = false;
- 
- 	/* Create a timer to use as a timeout on the reset */
- 	hrtimer_init_on_stack(&rtdata.timer, CLOCK_MONOTONIC, HRTIMER_MODE_REL);
-@@ -1972,7 +2582,7 @@ static int kbase_pm_do_reset(struct kbase_device *kbdev)
- 	/* Wait for the RESET_COMPLETED interrupt to be raised */
- 	kbase_pm_wait_for_reset(kbdev);
- 
--	if (rtdata.timed_out == 0) {
-+	if (!rtdata.timed_out) {
- 		/* GPU has been reset */
- 		hrtimer_cancel(&rtdata.timer);
- 		destroy_hrtimer_on_stack(&rtdata.timer);
-@@ -1980,46 +2590,60 @@ static int kbase_pm_do_reset(struct kbase_device *kbdev)
- 	}
- 
- 	/* No interrupt has been received - check if the RAWSTAT register says
--	 * the reset has completed */
-+	 * the reset has completed
-+	 */
- 	if ((kbase_reg_read(kbdev, GPU_CONTROL_REG(GPU_IRQ_RAWSTAT)) &
--							RESET_COMPLETED)
--		|| kbase_is_gpu_lost(kbdev)) {
-+							RESET_COMPLETED)) {
- 		/* The interrupt is set in the RAWSTAT; this suggests that the
--		 * interrupts are not getting to the CPU */
-+		 * interrupts are not getting to the CPU
-+		 */
- 		dev_err(kbdev->dev, "Reset interrupt didn't reach CPU. Check interrupt assignments.\n");
- 		/* If interrupts aren't working we can't continue. */
- 		destroy_hrtimer_on_stack(&rtdata.timer);
- 		return -EINVAL;
- 	}
- 
-+	if (kbase_is_gpu_removed(kbdev)) {
-+		dev_dbg(kbdev->dev, "GPU has been removed, reset no longer needed.\n");
-+		destroy_hrtimer_on_stack(&rtdata.timer);
-+		return -EINVAL;
-+	}
-+
- 	/* The GPU doesn't seem to be responding to the reset so try a hard
--	 * reset */
--	dev_err(kbdev->dev, "Failed to soft-reset GPU (timed out after %d ms), now attempting a hard reset\n",
--								RESET_TIMEOUT);
--	KBASE_KTRACE_ADD(kbdev, CORE_GPU_HARD_RESET, NULL, 0);
--	kbase_reg_write(kbdev, GPU_CONTROL_REG(GPU_COMMAND),
--						GPU_COMMAND_HARD_RESET);
-+	 * reset, but only when NOT in arbitration mode.
-+	 */
-+#ifdef CONFIG_MALI_ARBITER_SUPPORT
-+	if (!kbdev->arb.arb_if) {
-+#endif /* CONFIG_MALI_ARBITER_SUPPORT */
-+		dev_err(kbdev->dev, "Failed to soft-reset GPU (timed out after %d ms), now attempting a hard reset\n",
-+					RESET_TIMEOUT);
-+		KBASE_KTRACE_ADD(kbdev, CORE_GPU_HARD_RESET, NULL, 0);
-+		kbase_reg_write(kbdev, GPU_CONTROL_REG(GPU_COMMAND),
-+					GPU_COMMAND_HARD_RESET);
- 
--	/* Restart the timer to wait for the hard reset to complete */
--	rtdata.timed_out = 0;
-+		/* Restart the timer to wait for the hard reset to complete */
-+		rtdata.timed_out = false;
- 
--	hrtimer_start(&rtdata.timer, HR_TIMER_DELAY_MSEC(RESET_TIMEOUT),
--							HRTIMER_MODE_REL);
-+		hrtimer_start(&rtdata.timer, HR_TIMER_DELAY_MSEC(RESET_TIMEOUT),
-+					HRTIMER_MODE_REL);
- 
--	/* Wait for the RESET_COMPLETED interrupt to be raised */
--	kbase_pm_wait_for_reset(kbdev);
-+		/* Wait for the RESET_COMPLETED interrupt to be raised */
-+		kbase_pm_wait_for_reset(kbdev);
- 
--	if (rtdata.timed_out == 0) {
--		/* GPU has been reset */
--		hrtimer_cancel(&rtdata.timer);
--		destroy_hrtimer_on_stack(&rtdata.timer);
--		return 0;
--	}
-+		if (!rtdata.timed_out) {
-+			/* GPU has been reset */
-+			hrtimer_cancel(&rtdata.timer);
-+			destroy_hrtimer_on_stack(&rtdata.timer);
-+			return 0;
-+		}
- 
--	destroy_hrtimer_on_stack(&rtdata.timer);
-+		destroy_hrtimer_on_stack(&rtdata.timer);
- 
--	dev_err(kbdev->dev, "Failed to hard-reset the GPU (timed out after %d ms)\n",
--								RESET_TIMEOUT);
-+		dev_err(kbdev->dev, "Failed to hard-reset the GPU (timed out after %d ms)\n",
-+					RESET_TIMEOUT);
-+#ifdef CONFIG_MALI_ARBITER_SUPPORT
-+	}
-+#endif /* CONFIG_MALI_ARBITER_SUPPORT */
- 
- 	return -EINVAL;
- }
-@@ -2041,9 +2665,9 @@ int kbase_pm_protected_mode_disable(struct kbase_device *const kbdev)
- int kbase_pm_init_hw(struct kbase_device *kbdev, unsigned int flags)
- {
- 	unsigned long irq_flags;
--	int err;
-+	int err = 0;
- 
--	KBASE_DEBUG_ASSERT(NULL != kbdev);
-+	KBASE_DEBUG_ASSERT(kbdev != NULL);
- 	lockdep_assert_held(&kbdev->pm.lock);
- 
- 	/* Ensure the clock is on before attempting to access the hardware */
-@@ -2055,7 +2679,8 @@ int kbase_pm_init_hw(struct kbase_device *kbdev, unsigned int flags)
- 	}
- 
- 	/* Ensure interrupts are off to begin with, this also clears any
--	 * outstanding interrupts */
-+	 * outstanding interrupts
-+	 */
- 	kbase_pm_disable_interrupts(kbdev);
- 	/* Ensure cache snoops are disabled before reset. */
- 	kbase_pm_cache_snoop_disable(kbdev);
-@@ -2069,10 +2694,24 @@ int kbase_pm_init_hw(struct kbase_device *kbdev, unsigned int flags)
- 	spin_unlock_irqrestore(&kbdev->hwaccess_lock, irq_flags);
- 
- 	/* Soft reset the GPU */
--	err = kbdev->protected_ops->protected_mode_disable(
--			kbdev->protected_dev);
-+#ifdef CONFIG_MALI_ARBITER_SUPPORT
-+	if (!(flags & PM_NO_RESET))
-+#endif /* CONFIG_MALI_ARBITER_SUPPORT */
-+		err = kbdev->protected_ops->protected_mode_disable(
-+				kbdev->protected_dev);
- 
- 	spin_lock_irqsave(&kbdev->hwaccess_lock, irq_flags);
-+#if MALI_USE_CSF
-+	if (kbdev->protected_mode) {
-+		unsigned long flags;
-+
-+		kbase_ipa_control_protm_exited(kbdev);
-+
-+		kbase_csf_scheduler_spin_lock(kbdev, &flags);
-+		kbase_hwcnt_backend_csf_protm_exited(&kbdev->hwcnt_gpu_iface);
-+		kbase_csf_scheduler_spin_unlock(kbdev, flags);
-+	}
-+#endif
- 	kbdev->protected_mode = false;
- 	spin_unlock_irqrestore(&kbdev->hwaccess_lock, irq_flags);
- 
-@@ -2093,7 +2732,8 @@ int kbase_pm_init_hw(struct kbase_device *kbdev, unsigned int flags)
- 			GPU_STATUS_PROTECTED_MODE_ACTIVE);
- 
- 	/* If cycle counter was in use re-enable it, enable_irqs will only be
--	 * false when called from kbase_pm_powerup */
-+	 * false when called from kbase_pm_powerup
-+	 */
- 	if (kbdev->pm.backend.gpu_cycle_counter_requests &&
- 						(flags & PM_ENABLE_IRQS)) {
- 		kbase_pm_enable_interrupts(kbdev);
-@@ -2116,12 +2756,14 @@ int kbase_pm_init_hw(struct kbase_device *kbdev, unsigned int flags)
- 		kbase_pm_enable_interrupts(kbdev);
- 
- exit:
-+#if !MALI_USE_CSF
- 	if (!kbdev->pm.backend.protected_entry_transition_override) {
- 		/* Re-enable GPU hardware counters if we're resetting from
- 		 * protected mode.
- 		 */
- 		reenable_protected_mode_hwcnt(kbdev);
- 	}
-+#endif
- 
- 	return err;
- }
-@@ -2148,12 +2790,21 @@ kbase_pm_request_gpu_cycle_counter_do_request(struct kbase_device *kbdev)
- 
- 	spin_lock_irqsave(&kbdev->pm.backend.gpu_cycle_counter_requests_lock,
- 									flags);
--
- 	++kbdev->pm.backend.gpu_cycle_counter_requests;
- 
--	if (1 == kbdev->pm.backend.gpu_cycle_counter_requests)
-+	if (kbdev->pm.backend.gpu_cycle_counter_requests == 1)
- 		kbase_reg_write(kbdev, GPU_CONTROL_REG(GPU_COMMAND),
- 					GPU_COMMAND_CYCLE_COUNT_START);
-+	else {
-+		/* This might happen after GPU reset.
-+		 * Then counter needs to be kicked.
-+		 */
-+		if (!(kbase_reg_read(kbdev, GPU_CONTROL_REG(GPU_STATUS)) &
-+		      GPU_STATUS_CYCLE_COUNT_ACTIVE)) {
-+			kbase_reg_write(kbdev, GPU_CONTROL_REG(GPU_COMMAND),
-+					GPU_COMMAND_CYCLE_COUNT_START);
-+		}
-+	}
- 
- 	spin_unlock_irqrestore(
- 			&kbdev->pm.backend.gpu_cycle_counter_requests_lock,
-@@ -2169,6 +2820,8 @@ void kbase_pm_request_gpu_cycle_counter(struct kbase_device *kbdev)
- 	KBASE_DEBUG_ASSERT(kbdev->pm.backend.gpu_cycle_counter_requests <
- 								INT_MAX);
- 
-+	kbase_pm_wait_for_l2_powered(kbdev);
-+
- 	kbase_pm_request_gpu_cycle_counter_do_request(kbdev);
- }
- 
-@@ -2203,7 +2856,7 @@ void kbase_pm_release_gpu_cycle_counter_nolock(struct kbase_device *kbdev)
- 
- 	--kbdev->pm.backend.gpu_cycle_counter_requests;
- 
--	if (0 == kbdev->pm.backend.gpu_cycle_counter_requests)
-+	if (kbdev->pm.backend.gpu_cycle_counter_requests == 0)
- 		kbase_reg_write(kbdev, GPU_CONTROL_REG(GPU_COMMAND),
- 					GPU_COMMAND_CYCLE_COUNT_STOP);
- 
-diff --git a/dvalin/kernel/drivers/gpu/arm/midgard/backend/gpu/mali_kbase_pm_internal.h b/dvalin/kernel/drivers/gpu/arm/midgard/backend/gpu/mali_kbase_pm_internal.h
-index 95f10e0..70d009e 100644
---- a/dvalin/kernel/drivers/gpu/arm/midgard/backend/gpu/mali_kbase_pm_internal.h
-+++ b/dvalin/kernel/drivers/gpu/arm/midgard/backend/gpu/mali_kbase_pm_internal.h
-@@ -1,11 +1,12 @@
-+/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
- /*
-  *
-- * (C) COPYRIGHT 2010-2020 ARM Limited. All rights reserved.
-+ * (C) COPYRIGHT 2010-2021 ARM Limited. All rights reserved.
-  *
-  * This program is free software and is provided to you under the terms of the
-  * GNU General Public License version 2 as published by the Free Software
-  * Foundation, and any use by you of this program is subject to the terms
-- * of such GNU licence.
-+ * of such GNU license.
-  *
-  * This program is distributed in the hope that it will be useful,
-  * but WITHOUT ANY WARRANTY; without even the implied warranty of
-@@ -16,12 +17,8 @@
-  * along with this program; if not, you can access it online at
-  * http://www.gnu.org/licenses/gpl-2.0.html.
-  *
-- * SPDX-License-Identifier: GPL-2.0
-- *
-  */
- 
--
--
- /*
-  * Power management API definitions used internally by GPU backend
-  */
-@@ -31,7 +28,7 @@
- 
- #include <mali_kbase_hwaccess_pm.h>
- 
--#include "mali_kbase_pm_ca.h"
-+#include "backend/gpu/mali_kbase_pm_ca.h"
- #include "mali_kbase_pm_policy.h"
- 
- 
-@@ -205,6 +202,30 @@ int kbase_pm_init_hw(struct kbase_device *kbdev, unsigned int flags);
-  */
- void kbase_pm_reset_done(struct kbase_device *kbdev);
- 
-+#if MALI_USE_CSF
-+/**
-+ * kbase_pm_wait_for_desired_state - Wait for the desired power state to be
-+ *                                   reached
-+ *
-+ * Wait for the L2 and MCU state machines to reach the states corresponding
-+ * to the values of 'kbase_pm_is_l2_desired' and 'kbase_pm_is_mcu_desired'.
-+ *
-+ * The usual use-case for this is to ensure that all parts of GPU have been
-+ * powered up after performing a GPU Reset.
-+ *
-+ * Unlike kbase_pm_update_state(), the caller must not hold hwaccess_lock,
-+ * because this function will take that lock itself.
-+ *
-+ * NOTE: This may not wait until the correct state is reached if there is a
-+ * power off in progress and kbase_pm_context_active() was called instead of
-+ * kbase_csf_scheduler_pm_active().
-+ *
-+ * @kbdev: The kbase device structure for the device (must be a valid pointer)
-+ *
-+ * Return: 0 on success, error code on error
-+ */
-+int kbase_pm_wait_for_desired_state(struct kbase_device *kbdev);
-+#else
- /**
-  * kbase_pm_wait_for_desired_state - Wait for the desired power state to be
-  *                                   reached
-@@ -224,15 +245,17 @@ void kbase_pm_reset_done(struct kbase_device *kbdev);
-  * kbase_pm_wait_for_poweroff_complete()
-  *
-  * @kbdev: The kbase device structure for the device (must be a valid pointer)
-+ *
-+ * Return: 0 on success, error code on error
-  */
--void kbase_pm_wait_for_desired_state(struct kbase_device *kbdev);
-+int kbase_pm_wait_for_desired_state(struct kbase_device *kbdev);
-+#endif
- 
- /**
-  * kbase_pm_wait_for_l2_powered - Wait for the L2 cache to be powered on
-  *
-- * Wait for the L2 to be powered on, and for the L2 and shader state machines to
-- * stabilise by reaching the states corresponding to the values of 'l2_desired'
-- * and 'shaders_desired'.
-+ * Wait for the L2 to be powered on, and for the L2 and the state machines of
-+ * its dependent stack components to stabilise.
-  *
-  * kbdev->pm.active_count must be non-zero when calling this function.
-  *
-@@ -240,8 +263,10 @@ void kbase_pm_wait_for_desired_state(struct kbase_device *kbdev);
-  * because this function will take that lock itself.
-  *
-  * @kbdev: The kbase device structure for the device (must be a valid pointer)
-+ *
-+ * Return: 0 on success, error code on error
-  */
--void kbase_pm_wait_for_l2_powered(struct kbase_device *kbdev);
-+int kbase_pm_wait_for_l2_powered(struct kbase_device *kbdev);
- 
- /**
-  * kbase_pm_update_dynamic_cores_onoff - Update the L2 and shader power state
-@@ -467,7 +492,8 @@ void kbase_pm_register_access_enable(struct kbase_device *kbdev);
- void kbase_pm_register_access_disable(struct kbase_device *kbdev);
- 
- /* NOTE: kbase_pm_is_suspending is in mali_kbase.h, because it is an inline
-- * function */
-+ * function
-+ */
- 
- /**
-  * kbase_pm_metrics_is_active - Check if the power management metrics
-@@ -511,8 +537,22 @@ void kbase_pm_get_dvfs_metrics(struct kbase_device *kbdev,
- 
- #ifdef CONFIG_MALI_MIDGARD_DVFS
- 
-+#if MALI_USE_CSF
-+/**
-+ * kbase_platform_dvfs_event - Report utilisation to DVFS code for CSF GPU
-+ *
-+ * Function provided by platform specific code when DVFS is enabled to allow
-+ * the power management metrics system to report utilisation.
-+ *
-+ * @kbdev:         The kbase device structure for the device (must be a
-+ *                 valid pointer)
-+ * @utilisation:   The current calculated utilisation by the metrics system.
-+ * Return:         Returns 0 on failure and non zero on success.
-+ */
-+int kbase_platform_dvfs_event(struct kbase_device *kbdev, u32 utilisation);
-+#else
- /**
-- * kbase_platform_dvfs_event - Report utilisation to DVFS code
-+ * kbase_platform_dvfs_event - Report utilisation to DVFS code for JM GPU
-  *
-  * Function provided by platform specific code when DVFS is enabled to allow
-  * the power management metrics system to report utilisation.
-@@ -525,11 +565,12 @@ void kbase_pm_get_dvfs_metrics(struct kbase_device *kbdev,
-  *                 group.
-  * Return:         Returns 0 on failure and non zero on success.
-  */
--
- int kbase_platform_dvfs_event(struct kbase_device *kbdev, u32 utilisation,
--	u32 util_gl_share, u32 util_cl_share[2]);
-+			      u32 util_gl_share, u32 util_cl_share[2]);
- #endif
- 
-+#endif /* CONFIG_MALI_MIDGARD_DVFS */
-+
- void kbase_pm_power_changed(struct kbase_device *kbdev);
- 
- /**
-@@ -683,6 +724,72 @@ extern bool corestack_driver_control;
-  */
- bool kbase_pm_is_l2_desired(struct kbase_device *kbdev);
- 
-+#if MALI_USE_CSF
-+/**
-+ * kbase_pm_is_mcu_desired - Check whether MCU is desired
-+ *
-+ * @kbdev: Device pointer
-+ *
-+ * This shall be called to check whether MCU needs to be enabled.
-+ *
-+ * Return: true if MCU needs to be enabled.
-+ */
-+bool kbase_pm_is_mcu_desired(struct kbase_device *kbdev);
-+
-+/**
-+ * kbase_pm_idle_groups_sched_suspendable - Check whether the scheduler can be
-+ *                                        suspended to low power state when all
-+ *                                        the CSGs are idle
-+ *
-+ * @kbdev: Device pointer
-+ *
-+ * Return: true if allowed to enter the suspended state.
-+ */
-+static inline
-+bool kbase_pm_idle_groups_sched_suspendable(struct kbase_device *kbdev)
-+{
-+	lockdep_assert_held(&kbdev->hwaccess_lock);
-+
-+	return !(kbdev->pm.backend.csf_pm_sched_flags &
-+		 CSF_DYNAMIC_PM_SCHED_IGNORE_IDLE);
-+}
-+
-+/**
-+ * kbase_pm_no_runnables_sched_suspendable - Check whether the scheduler can be
-+ *                                        suspended to low power state when
-+ *                                        there are no runnable CSGs.
-+ *
-+ * @kbdev: Device pointer
-+ *
-+ * Return: true if allowed to enter the suspended state.
-+ */
-+static inline
-+bool kbase_pm_no_runnables_sched_suspendable(struct kbase_device *kbdev)
-+{
-+	lockdep_assert_held(&kbdev->hwaccess_lock);
-+
-+	return !(kbdev->pm.backend.csf_pm_sched_flags &
-+		 CSF_DYNAMIC_PM_SCHED_NO_SUSPEND);
-+}
-+
-+/**
-+ * kbase_pm_no_mcu_core_pwroff - Check whether the PM is required to keep the
-+ *                               MCU core powered in accordance to the active
-+ *                               power management policy
-+ *
-+ * @kbdev: Device pointer
-+ *
-+ * Return: true if the MCU is to retain powered.
-+ */
-+static inline bool kbase_pm_no_mcu_core_pwroff(struct kbase_device *kbdev)
-+{
-+	lockdep_assert_held(&kbdev->hwaccess_lock);
-+
-+	return kbdev->pm.backend.csf_pm_sched_flags &
-+		CSF_DYNAMIC_PM_CORE_KEEP_ON;
-+}
-+#endif
-+
- /**
-  * kbase_pm_lock - Lock all necessary mutexes to perform PM actions
-  *
-@@ -692,7 +799,9 @@ bool kbase_pm_is_l2_desired(struct kbase_device *kbdev);
-  */
- static inline void kbase_pm_lock(struct kbase_device *kbdev)
- {
-+#if !MALI_USE_CSF
- 	mutex_lock(&kbdev->js_data.runpool_mutex);
-+#endif /* !MALI_USE_CSF */
- 	mutex_lock(&kbdev->pm.lock);
- }
- 
-@@ -704,7 +813,9 @@ static inline void kbase_pm_lock(struct kbase_device *kbdev)
- static inline void kbase_pm_unlock(struct kbase_device *kbdev)
- {
- 	mutex_unlock(&kbdev->pm.lock);
-+#if !MALI_USE_CSF
- 	mutex_unlock(&kbdev->js_data.runpool_mutex);
-+#endif /* !MALI_USE_CSF */
- }
- 
- #endif /* _KBASE_BACKEND_PM_INTERNAL_H_ */
-diff --git a/dvalin/kernel/drivers/gpu/arm/midgard/backend/gpu/mali_kbase_pm_l2_states.h b/dvalin/kernel/drivers/gpu/arm/midgard/backend/gpu/mali_kbase_pm_l2_states.h
-index 12cb051..ef72f60 100644
---- a/dvalin/kernel/drivers/gpu/arm/midgard/backend/gpu/mali_kbase_pm_l2_states.h
-+++ b/dvalin/kernel/drivers/gpu/arm/midgard/backend/gpu/mali_kbase_pm_l2_states.h
-@@ -1,11 +1,12 @@
-+/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
- /*
-  *
-- * (C) COPYRIGHT 2019 ARM Limited. All rights reserved.
-+ * (C) COPYRIGHT 2018-2021 ARM Limited. All rights reserved.
-  *
-  * This program is free software and is provided to you under the terms of the
-  * GNU General Public License version 2 as published by the Free Software
-  * Foundation, and any use by you of this program is subject to the terms
-- * of such GNU licence.
-+ * of such GNU license.
-  *
-  * This program is distributed in the hope that it will be useful,
-  * but WITHOUT ANY WARRANTY; without even the implied warranty of
-@@ -16,8 +17,6 @@
-  * along with this program; if not, you can access it online at
-  * http://www.gnu.org/licenses/gpl-2.0.html.
-  *
-- * SPDX-License-Identifier: GPL-2.0
-- *
-  */
- 
- /*
-@@ -25,6 +24,19 @@
-  * The function-like macro KBASEP_L2_STATE() must be defined before including
-  * this header file. This header file can be included multiple times in the
-  * same compilation unit with different definitions of KBASEP_L2_STATE().
-+ *
-+ * @OFF:              The L2 cache and tiler are off
-+ * @PEND_ON:          The L2 cache and tiler are powering on
-+ * @RESTORE_CLOCKS:   The GPU clock is restored. Conditionally used.
-+ * @ON_HWCNT_ENABLE:  The L2 cache and tiler are on, and hwcnt is being enabled
-+ * @ON:               The L2 cache and tiler are on, and hwcnt is enabled
-+ * @ON_HWCNT_DISABLE: The L2 cache and tiler are on, and hwcnt is being disabled
-+ * @SLOW_DOWN_CLOCKS: The GPU clock is set to appropriate or lowest clock.
-+ *                    Conditionally used.
-+ * @POWER_DOWN:       The L2 cache and tiler are about to be powered off
-+ * @PEND_OFF:         The L2 cache and tiler are powering off
-+ * @RESET_WAIT:       The GPU is resetting, L2 cache and tiler power state are
-+ *                    unknown
-  */
- KBASEP_L2_STATE(OFF)
- KBASEP_L2_STATE(PEND_ON)
-diff --git a/dvalin/kernel/drivers/gpu/arm/midgard/backend/gpu/mali_kbase_pm_mcu_states.h b/dvalin/kernel/drivers/gpu/arm/midgard/backend/gpu/mali_kbase_pm_mcu_states.h
-new file mode 100644
-index 0000000..4e99928
---- /dev/null
-+++ b/dvalin/kernel/drivers/gpu/arm/midgard/backend/gpu/mali_kbase_pm_mcu_states.h
-@@ -0,0 +1,63 @@
-+/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
-+/*
-+ *
-+ * (C) COPYRIGHT 2020-2021 ARM Limited. All rights reserved.
-+ *
-+ * This program is free software and is provided to you under the terms of the
-+ * GNU General Public License version 2 as published by the Free Software
-+ * Foundation, and any use by you of this program is subject to the terms
-+ * of such GNU license.
-+ *
-+ * This program is distributed in the hope that it will be useful,
-+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
-+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-+ * GNU General Public License for more details.
-+ *
-+ * You should have received a copy of the GNU General Public License
-+ * along with this program; if not, you can access it online at
-+ * http://www.gnu.org/licenses/gpl-2.0.html.
-+ *
-+ */
-+
-+/*
-+ * Backend-specific Power Manager MCU state definitions.
-+ * The function-like macro KBASEP_MCU_STATE() must be defined before including
-+ * this header file. This header file can be included multiple times in the
-+ * same compilation unit with different definitions of KBASEP_MCU_STATE().
-+ *
-+ * @OFF:                      The MCU is powered off.
-+ * @PEND_ON_RELOAD:           The warm boot of MCU or cold boot of MCU (with
-+ *                            firmware reloading) is in progress.
-+ * @ON_GLB_REINIT_PEND:       The MCU is enabled and Global configuration
-+ *                            requests have been sent to the firmware.
-+ * @ON_HWCNT_ENABLE:          The Global requests have completed and MCU is now
-+ *                            ready for use and hwcnt is being enabled.
-+ * @ON:                       The MCU is active and hwcnt has been enabled.
-+ * @ON_CORE_ATTR_UPDATE_PEND: The MCU is active and mask of enabled shader cores
-+ *                            is being updated.
-+ * @ON_HWCNT_DISABLE:         The MCU is on and hwcnt is being disabled.
-+ * @ON_HALT:                  The MCU is on and hwcnt has been disabled, MCU
-+ *                            halt would be triggered.
-+ * @ON_PEND_HALT:             MCU halt in progress, confirmation pending.
-+ * @POWER_DOWN:               MCU halted operations, pending being disabled.
-+ * @PEND_OFF:                 MCU is being disabled, pending on powering off.
-+ * @RESET_WAIT:               The GPU is resetting, MCU state is unknown.
-+ */
-+KBASEP_MCU_STATE(OFF)
-+KBASEP_MCU_STATE(PEND_ON_RELOAD)
-+KBASEP_MCU_STATE(ON_GLB_REINIT_PEND)
-+KBASEP_MCU_STATE(ON_HWCNT_ENABLE)
-+KBASEP_MCU_STATE(ON)
-+KBASEP_MCU_STATE(ON_CORE_ATTR_UPDATE_PEND)
-+KBASEP_MCU_STATE(ON_HWCNT_DISABLE)
-+KBASEP_MCU_STATE(ON_HALT)
-+KBASEP_MCU_STATE(ON_PEND_HALT)
-+KBASEP_MCU_STATE(POWER_DOWN)
-+KBASEP_MCU_STATE(PEND_OFF)
-+KBASEP_MCU_STATE(RESET_WAIT)
-+/* Additional MCU states with HOST_CONTROL_SHADERS */
-+KBASEP_MCU_STATE(HCTL_SHADERS_PEND_ON)
-+KBASEP_MCU_STATE(HCTL_CORES_NOTIFY_PEND)
-+KBASEP_MCU_STATE(HCTL_MCU_ON_RECHECK)
-+KBASEP_MCU_STATE(HCTL_SHADERS_READY_OFF)
-+KBASEP_MCU_STATE(HCTL_SHADERS_PEND_OFF)
-diff --git a/dvalin/kernel/drivers/gpu/arm/midgard/backend/gpu/mali_kbase_pm_metrics.c b/dvalin/kernel/drivers/gpu/arm/midgard/backend/gpu/mali_kbase_pm_metrics.c
-index de3babe..69e8dd3 100644
---- a/dvalin/kernel/drivers/gpu/arm/midgard/backend/gpu/mali_kbase_pm_metrics.c
-+++ b/dvalin/kernel/drivers/gpu/arm/midgard/backend/gpu/mali_kbase_pm_metrics.c
-@@ -1,11 +1,12 @@
-+// SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note
- /*
-  *
-- * (C) COPYRIGHT 2011-2020 ARM Limited. All rights reserved.
-+ * (C) COPYRIGHT 2011-2021 ARM Limited. All rights reserved.
-  *
-  * This program is free software and is provided to you under the terms of the
-  * GNU General Public License version 2 as published by the Free Software
-  * Foundation, and any use by you of this program is subject to the terms
-- * of such GNU licence.
-+ * of such GNU license.
-  *
-  * This program is distributed in the hope that it will be useful,
-  * but WITHOUT ANY WARRANTY; without even the implied warranty of
-@@ -16,12 +17,8 @@
-  * along with this program; if not, you can access it online at
-  * http://www.gnu.org/licenses/gpl-2.0.html.
-  *
-- * SPDX-License-Identifier: GPL-2.0
-- *
-  */
- 
--
--
- /*
-  * Metrics for power management
-  */
-@@ -29,22 +26,28 @@
- #include <mali_kbase.h>
- #include <mali_kbase_pm.h>
- #include <backend/gpu/mali_kbase_pm_internal.h>
-+
-+#if MALI_USE_CSF
-+#include "backend/gpu/mali_kbase_clk_rate_trace_mgr.h"
-+#include <csf/ipa_control/mali_kbase_csf_ipa_control.h>
-+#else
- #include <backend/gpu/mali_kbase_jm_rb.h>
-+#endif /* !MALI_USE_CSF */
-+
- #include <backend/gpu/mali_kbase_pm_defs.h>
- #include <mali_linux_trace.h>
- 
--/* When VSync is being hit aim for utilisation between 70-90% */
--#define KBASE_PM_VSYNC_MIN_UTILISATION          70
--#define KBASE_PM_VSYNC_MAX_UTILISATION          90
--/* Otherwise aim for 10-40% */
--#define KBASE_PM_NO_VSYNC_MIN_UTILISATION       10
--#define KBASE_PM_NO_VSYNC_MAX_UTILISATION       40
--
- /* Shift used for kbasep_pm_metrics_data.time_busy/idle - units of (1 << 8) ns
-  * This gives a maximum period between samples of 2^(32+8)/100 ns = slightly
-- * under 11s. Exceeding this will cause overflow */
-+ * under 11s. Exceeding this will cause overflow
-+ */
- #define KBASE_PM_TIME_SHIFT			8
- 
-+#if MALI_USE_CSF
-+/* To get the GPU_ACTIVE value in nano seconds unit */
-+#define GPU_ACTIVE_SCALING_FACTOR ((u64)1E9)
-+#endif
-+
- #ifdef CONFIG_MALI_MIDGARD_DVFS
- static enum hrtimer_restart dvfs_callback(struct hrtimer *timer)
- {
-@@ -71,11 +74,45 @@ static enum hrtimer_restart dvfs_callback(struct hrtimer *timer)
- 
- int kbasep_pm_metrics_init(struct kbase_device *kbdev)
- {
--	KBASE_DEBUG_ASSERT(kbdev != NULL);
-+#if MALI_USE_CSF
-+	struct kbase_ipa_control_perf_counter perf_counter;
-+	int err;
- 
-+	/* One counter group */
-+	const size_t NUM_PERF_COUNTERS = 1;
-+
-+	KBASE_DEBUG_ASSERT(kbdev != NULL);
- 	kbdev->pm.backend.metrics.kbdev = kbdev;
-+	kbdev->pm.backend.metrics.time_period_start = ktime_get();
-+	kbdev->pm.backend.metrics.values.time_busy = 0;
-+	kbdev->pm.backend.metrics.values.time_idle = 0;
-+	kbdev->pm.backend.metrics.values.time_in_protm = 0;
-+
-+	perf_counter.scaling_factor = GPU_ACTIVE_SCALING_FACTOR;
- 
-+	/* Normalize values by GPU frequency */
-+	perf_counter.gpu_norm = true;
-+
-+	/* We need the GPU_ACTIVE counter, which is in the CSHW group */
-+	perf_counter.type = KBASE_IPA_CORE_TYPE_CSHW;
-+
-+	/* We need the GPU_ACTIVE counter */
-+	perf_counter.idx = GPU_ACTIVE_CNT_IDX;
-+
-+	err = kbase_ipa_control_register(
-+		kbdev, &perf_counter, NUM_PERF_COUNTERS,
-+		&kbdev->pm.backend.metrics.ipa_control_client);
-+	if (err) {
-+		dev_err(kbdev->dev,
-+			"Failed to register IPA with kbase_ipa_control: err=%d",
-+			err);
-+		return -1;
-+	}
-+#else
-+	KBASE_DEBUG_ASSERT(kbdev != NULL);
-+	kbdev->pm.backend.metrics.kbdev = kbdev;
- 	kbdev->pm.backend.metrics.time_period_start = ktime_get();
-+
- 	kbdev->pm.backend.metrics.gpu_active = false;
- 	kbdev->pm.backend.metrics.active_cl_ctx[0] = 0;
- 	kbdev->pm.backend.metrics.active_cl_ctx[1] = 0;
-@@ -89,16 +126,25 @@ int kbasep_pm_metrics_init(struct kbase_device *kbdev)
- 	kbdev->pm.backend.metrics.values.busy_cl[1] = 0;
- 	kbdev->pm.backend.metrics.values.busy_gl = 0;
- 
-+#endif
- 	spin_lock_init(&kbdev->pm.backend.metrics.lock);
- 
- #ifdef CONFIG_MALI_MIDGARD_DVFS
- 	hrtimer_init(&kbdev->pm.backend.metrics.timer, CLOCK_MONOTONIC,
- 							HRTIMER_MODE_REL);
- 	kbdev->pm.backend.metrics.timer.function = dvfs_callback;
--
-+	kbdev->pm.backend.metrics.initialized = true;
- 	kbase_pm_metrics_start(kbdev);
- #endif /* CONFIG_MALI_MIDGARD_DVFS */
- 
-+#if MALI_USE_CSF
-+	/* The sanity check on the GPU_ACTIVE performance counter
-+	 * is skipped for Juno platforms that have timing problems.
-+	 */
-+	kbdev->pm.backend.metrics.skip_gpu_active_sanity_check =
-+		of_machine_is_compatible("arm,juno");
-+#endif
-+
- 	return 0;
- }
- KBASE_EXPORT_TEST_API(kbasep_pm_metrics_init);
-@@ -115,7 +161,13 @@ void kbasep_pm_metrics_term(struct kbase_device *kbdev)
- 	spin_unlock_irqrestore(&kbdev->pm.backend.metrics.lock, flags);
- 
- 	hrtimer_cancel(&kbdev->pm.backend.metrics.timer);
-+	kbdev->pm.backend.metrics.initialized = false;
- #endif /* CONFIG_MALI_MIDGARD_DVFS */
-+
-+#if MALI_USE_CSF
-+	kbase_ipa_control_unregister(
-+		kbdev, kbdev->pm.backend.metrics.ipa_control_client);
-+#endif
- }
- 
- KBASE_EXPORT_TEST_API(kbasep_pm_metrics_term);
-@@ -123,8 +175,117 @@ KBASE_EXPORT_TEST_API(kbasep_pm_metrics_term);
- /* caller needs to hold kbdev->pm.backend.metrics.lock before calling this
-  * function
-  */
-+#if MALI_USE_CSF
-+#if defined(CONFIG_MALI_DEVFREQ) || defined(CONFIG_MALI_MIDGARD_DVFS)
-+static void kbase_pm_get_dvfs_utilisation_calc(struct kbase_device *kbdev)
-+{
-+	int err;
-+	u64 gpu_active_counter;
-+	u64 protected_time;
-+	ktime_t now;
-+
-+	lockdep_assert_held(&kbdev->pm.backend.metrics.lock);
-+
-+	/* Query IPA_CONTROL for the latest GPU-active and protected-time
-+	 * info.
-+	 */
-+	err = kbase_ipa_control_query(
-+		kbdev, kbdev->pm.backend.metrics.ipa_control_client,
-+		&gpu_active_counter, 1, &protected_time);
-+
-+	/* Read the timestamp after reading the GPU_ACTIVE counter value.
-+	 * This ensures the time gap between the 2 reads is consistent for
-+	 * a meaningful comparison between the increment of GPU_ACTIVE and
-+	 * elapsed time. The lock taken inside kbase_ipa_control_query()
-+	 * function can cause lot of variation.
-+	 */
-+	now = ktime_get();
-+
-+	if (err) {
-+		dev_err(kbdev->dev,
-+			"Failed to query the increment of GPU_ACTIVE counter: err=%d",
-+			err);
-+	} else {
-+		u64 diff_ns;
-+		s64 diff_ns_signed;
-+		u32 ns_time;
-+		ktime_t diff = ktime_sub(
-+			now, kbdev->pm.backend.metrics.time_period_start);
-+
-+		diff_ns_signed = ktime_to_ns(diff);
-+
-+		if (diff_ns_signed < 0)
-+			return;
-+
-+		diff_ns = (u64)diff_ns_signed;
-+
-+#if !IS_ENABLED(CONFIG_MALI_NO_MALI)
-+		/* The GPU_ACTIVE counter shouldn't clock-up more time than has
-+		 * actually elapsed - but still some margin needs to be given
-+		 * when doing the comparison. There could be some drift between
-+		 * the CPU and GPU clock.
-+		 *
-+		 * Can do the check only in a real driver build, as an arbitrary
-+		 * value for GPU_ACTIVE can be fed into dummy model in no_mali
-+		 * configuration which may not correspond to the real elapsed
-+		 * time.
-+		 */
-+		if (!kbdev->pm.backend.metrics.skip_gpu_active_sanity_check) {
-+			/* Use a margin value that is approximately 1% of the time
-+			 * difference.
-+			 */
-+			u64 margin_ns = diff_ns >> 6;
-+			if (gpu_active_counter > (diff_ns + margin_ns)) {
-+				dev_info(
-+					kbdev->dev,
-+					"GPU activity takes longer than time interval: %llu ns > %llu ns",
-+					(unsigned long long)gpu_active_counter,
-+					(unsigned long long)diff_ns);
-+			}
-+		}
-+#endif
-+		/* Calculate time difference in units of 256ns */
-+		ns_time = (u32)(diff_ns >> KBASE_PM_TIME_SHIFT);
-+
-+		/* Add protected_time to gpu_active_counter so that time in
-+		 * protected mode is included in the apparent GPU active time,
-+		 * then convert it from units of 1ns to units of 256ns, to
-+		 * match what JM GPUs use. The assumption is made here that the
-+		 * GPU is 100% busy while in protected mode, so we should add
-+		 * this since the GPU can't (and thus won't) update these
-+		 * counters while it's actually in protected mode.
-+		 *
-+		 * Perform the add after dividing each value down, to reduce
-+		 * the chances of overflows.
-+		 */
-+		protected_time >>= KBASE_PM_TIME_SHIFT;
-+		gpu_active_counter >>= KBASE_PM_TIME_SHIFT;
-+		gpu_active_counter += protected_time;
-+
-+		/* Ensure the following equations don't go wrong if ns_time is
-+		 * slightly larger than gpu_active_counter somehow
-+		 */
-+		gpu_active_counter = MIN(gpu_active_counter, ns_time);
-+
-+		kbdev->pm.backend.metrics.values.time_busy +=
-+			gpu_active_counter;
-+
-+		kbdev->pm.backend.metrics.values.time_idle +=
-+			ns_time - gpu_active_counter;
-+
-+		/* Also make time in protected mode available explicitly,
-+		 * so users of this data have this info, too.
-+		 */
-+		kbdev->pm.backend.metrics.values.time_in_protm +=
-+			protected_time;
-+	}
-+
-+	kbdev->pm.backend.metrics.time_period_start = now;
-+}
-+#endif /* defined(CONFIG_MALI_DEVFREQ) || defined(CONFIG_MALI_MIDGARD_DVFS) */
-+#else
- static void kbase_pm_get_dvfs_utilisation_calc(struct kbase_device *kbdev,
--								ktime_t now)
-+					       ktime_t now)
- {
- 	ktime_t diff;
- 
-@@ -149,12 +310,13 @@ static void kbase_pm_get_dvfs_utilisation_calc(struct kbase_device *kbdev,
- 		if (kbdev->pm.backend.metrics.active_gl_ctx[2])
- 			kbdev->pm.backend.metrics.values.busy_gl += ns_time;
- 	} else {
--		kbdev->pm.backend.metrics.values.time_idle += (u32) (ktime_to_ns(diff)
--							>> KBASE_PM_TIME_SHIFT);
-+		kbdev->pm.backend.metrics.values.time_idle +=
-+			(u32)(ktime_to_ns(diff) >> KBASE_PM_TIME_SHIFT);
- 	}
- 
- 	kbdev->pm.backend.metrics.time_period_start = now;
- }
-+#endif  /* MALI_USE_CSF */
- 
- #if defined(CONFIG_MALI_DEVFREQ) || defined(CONFIG_MALI_MIDGARD_DVFS)
- void kbase_pm_get_dvfs_metrics(struct kbase_device *kbdev,
-@@ -165,14 +327,23 @@ void kbase_pm_get_dvfs_metrics(struct kbase_device *kbdev,
- 	unsigned long flags;
- 
- 	spin_lock_irqsave(&kbdev->pm.backend.metrics.lock, flags);
-+#if MALI_USE_CSF
-+	kbase_pm_get_dvfs_utilisation_calc(kbdev);
-+#else
- 	kbase_pm_get_dvfs_utilisation_calc(kbdev, ktime_get());
-+#endif