From fffc58d2b4f70d6655f5022c026e0614df4411e4 Mon Sep 17 00:00:00 2001 From: Jack Diver Date: Wed, 22 Nov 2023 17:15:57 +0000 Subject: mali_pixel: Periodically read ACPM GPU signal Use ACPM GPU signal to make enable/disable decisions for the SLC partition. Currently, the signal is sampled during scheduling tick. Bug: 313458962 Test: gfxbench Signed-off-by: Jack Diver (cherry picked from https://partner-android-review.googlesource.com/q/commit:dec457352147d282921e0ae81ce3a7154e80c64e) Merged-In: Ife0adedf6006daaf17062a0f555d126c1fd45465 Change-Id: Ife0adedf6006daaf17062a0f555d126c1fd45465 --- mali_kbase/backend/gpu/mali_kbase_js_backend.c | 3 +++ mali_kbase/csf/mali_kbase_csf_scheduler.c | 4 ++++ mali_kbase/mali_kbase_config.c | 9 +++++++++ mali_kbase/mali_kbase_config.h | 18 ++++++++++++++++++ mali_kbase/platform/pixel/pixel_gpu.c | 1 + mali_kbase/platform/pixel/pixel_gpu_slc.c | 10 ++++++++++ mali_kbase/platform/pixel/pixel_gpu_slc.h | 4 ++++ 7 files changed, 49 insertions(+) (limited to 'mali_kbase') diff --git a/mali_kbase/backend/gpu/mali_kbase_js_backend.c b/mali_kbase/backend/gpu/mali_kbase_js_backend.c index be72c4a..304737f 100644 --- a/mali_kbase/backend/gpu/mali_kbase_js_backend.c +++ b/mali_kbase/backend/gpu/mali_kbase_js_backend.c @@ -244,6 +244,9 @@ static enum hrtimer_restart timer_callback(struct hrtimer *timer) spin_unlock_irqrestore(&kbdev->hwaccess_lock, flags); + /* Inform platform of scheduling event */ + kbasep_platform_event_tick_tock(kbdev); + return HRTIMER_NORESTART; } diff --git a/mali_kbase/csf/mali_kbase_csf_scheduler.c b/mali_kbase/csf/mali_kbase_csf_scheduler.c index f7f7ed0..22a08a6 100644 --- a/mali_kbase/csf/mali_kbase_csf_scheduler.c +++ b/mali_kbase/csf/mali_kbase_csf_scheduler.c @@ -43,6 +43,7 @@ #include #include #endif /* CONFIG_MALI_TRACE_POWER_GPU_WORK_PERIOD */ +#include /* Value to indicate that a queue group is not groups_to_schedule list */ #define KBASEP_GROUP_PREPARED_SEQ_NUM_INVALID (U32_MAX) @@ -6685,6 +6686,9 @@ static int kbase_csf_scheduler_kthread(void *data) dev_dbg(kbdev->dev, "Waking up for event after a scheduling iteration."); wake_up_all(&kbdev->csf.event_wait); + + /* Inform platform of scheduling event */ + kbasep_platform_event_tick_tock(kbdev); } /* Wait for the other thread, that signaled the exit, to call kthread_stop() */ diff --git a/mali_kbase/mali_kbase_config.c b/mali_kbase/mali_kbase_config.c index 72080a7..669e1c3 100644 --- a/mali_kbase/mali_kbase_config.c +++ b/mali_kbase/mali_kbase_config.c @@ -119,6 +119,15 @@ void kbasep_platform_event_work_end(void *param) platform_funcs_p->platform_handler_work_end_func(param); } +void kbasep_platform_event_tick_tock(struct kbase_device *kbdev) +{ + struct kbase_platform_funcs_conf *platform_funcs_p; + + platform_funcs_p = (struct kbase_platform_funcs_conf*)PLATFORM_FUNCS; + if (platform_funcs_p && platform_funcs_p->platform_handler_tick_tock) + platform_funcs_p->platform_handler_tick_tock(kbdev); +} + int kbasep_platform_fw_config_init(struct kbase_device *kbdev) { struct kbase_platform_funcs_conf *platform_funcs_p; diff --git a/mali_kbase/mali_kbase_config.h b/mali_kbase/mali_kbase_config.h index 7f6d3ed..549c170 100644 --- a/mali_kbase/mali_kbase_config.h +++ b/mali_kbase/mali_kbase_config.h @@ -137,6 +137,14 @@ struct kbase_platform_funcs_conf { * Context: Atomic context */ void (*platform_handler_context_idle)(struct kbase_context *kctx); + /** + * platform_handler_tick_tock - Platform specific callback when a scheduler tick/tock occurs. + * + * @kbdev: kbase_device pointer + * + * Context: Process context + */ + void (*platform_handler_tick_tock)(struct kbase_device *kbdev); /** * platform_handler_work_begin_func - Platform specific handler whose * function changes depending on the @@ -633,6 +641,16 @@ void kbasep_platform_event_work_begin(void *param); */ void kbasep_platform_event_work_end(void *param); +/** + * kbasep_platform_tick_tock - Platform specific callback when a scheduler tick/tock occurs. + * + * @kbdev: kbase_device pointer + * + * Function calls a platform defined routine if specified in the configuration attributes. + * + */ +void kbasep_platform_event_tick_tock(struct kbase_device *kbdev); + /** * kbasep_platform_fw_config_init - Platform specific callback to configure FW * diff --git a/mali_kbase/platform/pixel/pixel_gpu.c b/mali_kbase/platform/pixel/pixel_gpu.c index ba0ceb8..6e30053 100644 --- a/mali_kbase/platform/pixel/pixel_gpu.c +++ b/mali_kbase/platform/pixel/pixel_gpu.c @@ -282,6 +282,7 @@ struct kbase_platform_funcs_conf platform_funcs = { .platform_handler_work_end_func = &gpu_dvfs_metrics_work_end, .platform_handler_context_active = &gpu_slc_kctx_active, .platform_handler_context_idle = &gpu_slc_kctx_idle, + .platform_handler_tick_tock = &gpu_slc_tick_tock, .platform_fw_cfg_init_func = &gpu_fw_cfg_init, .platform_handler_core_dump_func = &gpu_sscd_dump, }; diff --git a/mali_kbase/platform/pixel/pixel_gpu_slc.c b/mali_kbase/platform/pixel/pixel_gpu_slc.c index e8aae75..cf330af 100644 --- a/mali_kbase/platform/pixel/pixel_gpu_slc.c +++ b/mali_kbase/platform/pixel/pixel_gpu_slc.c @@ -125,6 +125,16 @@ void gpu_slc_kctx_idle(struct kbase_context *kctx) pixel_mgm_slc_dec_refcount(kctx->kbdev->mgm_dev); } +/** + * gpu_slc_tick_tock() - Called when a GPU scheduling kick occurs + * + * @kbdev: The &struct kbase_device for the GPU. + */ +void gpu_slc_tick_tock(struct kbase_device *kbdev) +{ + pixel_mgm_slc_update_signal(kbdev->mgm_dev, 0); +} + /** * gpu_slc_init - Initialize the SLC context for the GPU * diff --git a/mali_kbase/platform/pixel/pixel_gpu_slc.h b/mali_kbase/platform/pixel/pixel_gpu_slc.h index 82d0779..cca2af9 100644 --- a/mali_kbase/platform/pixel/pixel_gpu_slc.h +++ b/mali_kbase/platform/pixel/pixel_gpu_slc.h @@ -22,6 +22,8 @@ void gpu_slc_kctx_term(struct kbase_context *kctx); void gpu_slc_kctx_active(struct kbase_context *kctx); void gpu_slc_kctx_idle(struct kbase_context *kctx); + +void gpu_slc_tick_tock(struct kbase_device *kbdev); #else static int __maybe_unused gpu_pixel_handle_buffer_liveness_update_ioctl(struct kbase_context* kctx, struct kbase_ioctl_buffer_liveness_update* update) @@ -40,6 +42,8 @@ static void __maybe_unused gpu_slc_kctx_term(struct kbase_context* kctx) { (void static void __maybe_unused gpu_slc_kctx_active(struct kbase_context *kctx) { (void)kctx; } static void __maybe_unused gpu_slc_kctx_idle(struct kbase_context *kctx) { (void)kctx; } + +static void __maybe_unused gpu_slc_tick_tock(struct kbase_device *kbdev) { (void)kbdev; } #endif /* CONFIG_MALI_PIXEL_GPU_SLC */ #endif /* _PIXEL_GPU_SLC_H_ */ -- cgit v1.2.3