hc
2023-12-06 08f87f769b595151be1afeff53e144f543faa614
kernel/drivers/gpu/arm/bifrost/backend/gpu/mali_kbase_pm_ca.c
....@@ -1,7 +1,7 @@
11 // SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note
22 /*
33 *
4
- * (C) COPYRIGHT 2013-2021 ARM Limited. All rights reserved.
4
+ * (C) COPYRIGHT 2013-2022 ARM Limited. All rights reserved.
55 *
66 * This program is free software and is provided to you under the terms of the
77 * GNU General Public License version 2 as published by the Free Software
....@@ -26,6 +26,7 @@
2626 #include <mali_kbase.h>
2727 #include <mali_kbase_pm.h>
2828 #include <backend/gpu/mali_kbase_pm_internal.h>
29
+#include <backend/gpu/mali_kbase_model_linux.h>
2930 #include <mali_kbase_dummy_job_wa.h>
3031
3132 int kbase_pm_ca_init(struct kbase_device *kbdev)
....@@ -52,6 +53,9 @@
5253 {
5354 struct kbase_pm_backend_data *pm_backend = &kbdev->pm.backend;
5455 unsigned long flags;
56
+#if MALI_USE_CSF
57
+ u64 old_core_mask = 0;
58
+#endif
5559
5660 spin_lock_irqsave(&kbdev->hwaccess_lock, flags);
5761
....@@ -62,6 +66,8 @@
6266 core_mask, kbdev->pm.debug_core_mask);
6367 goto unlock;
6468 }
69
+
70
+ old_core_mask = pm_backend->ca_cores_enabled;
6571 #else
6672 if (!(core_mask & kbdev->pm.debug_core_mask_all)) {
6773 dev_err(kbdev->dev, "OPP core mask 0x%llX does not intersect with debug mask 0x%llX\n",
....@@ -70,20 +76,34 @@
7076 }
7177
7278 if (kbase_dummy_job_wa_enabled(kbdev)) {
73
- dev_err(kbdev->dev, "Dynamic core scaling not supported as dummy job WA is enabled");
79
+ dev_err_once(kbdev->dev, "Dynamic core scaling not supported as dummy job WA is enabled");
7480 goto unlock;
7581 }
7682 #endif /* MALI_USE_CSF */
77
-
7883 pm_backend->ca_cores_enabled = core_mask;
7984
8085 kbase_pm_update_state(kbdev);
81
-
82
-unlock:
8386 spin_unlock_irqrestore(&kbdev->hwaccess_lock, flags);
87
+
88
+#if MALI_USE_CSF
89
+ /* Check if old_core_mask contained the undesired cores and wait
90
+ * for those cores to get powered down
91
+ */
92
+ if ((core_mask & old_core_mask) != old_core_mask) {
93
+ if (kbase_pm_wait_for_cores_down_scale(kbdev)) {
94
+ dev_warn(kbdev->dev,
95
+ "Wait for update of core_mask from %llx to %llx failed",
96
+ old_core_mask, core_mask);
97
+ }
98
+ }
99
+#endif
84100
85101 dev_dbg(kbdev->dev, "Devfreq policy : new core mask=%llX\n",
86102 pm_backend->ca_cores_enabled);
103
+
104
+ return;
105
+unlock:
106
+ spin_unlock_irqrestore(&kbdev->hwaccess_lock, flags);
87107 }
88108 KBASE_EXPORT_TEST_API(kbase_devfreq_set_core_mask);
89109 #endif
....@@ -120,7 +140,9 @@
120140 {
121141 lockdep_assert_held(&kbdev->hwaccess_lock);
122142
123
-#if MALI_USE_CSF
143
+#if IS_ENABLED(CONFIG_MALI_BIFROST_NO_MALI)
144
+ return (((1ull) << KBASE_DUMMY_MODEL_MAX_SHADER_CORES) - 1);
145
+#elif MALI_USE_CSF
124146 return kbase_pm_get_ready_cores(kbdev, KBASE_PM_CORE_SHADER);
125147 #else
126148 return kbdev->pm.backend.pm_shaders_core_mask;