.. | .. |
---|
1 | 1 | // SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note |
---|
2 | 2 | /* |
---|
3 | 3 | * |
---|
4 | | - * (C) COPYRIGHT 2013-2021 ARM Limited. All rights reserved. |
---|
| 4 | + * (C) COPYRIGHT 2013-2022 ARM Limited. All rights reserved. |
---|
5 | 5 | * |
---|
6 | 6 | * This program is free software and is provided to you under the terms of the |
---|
7 | 7 | * GNU General Public License version 2 as published by the Free Software |
---|
.. | .. |
---|
26 | 26 | #include <mali_kbase.h> |
---|
27 | 27 | #include <mali_kbase_pm.h> |
---|
28 | 28 | #include <backend/gpu/mali_kbase_pm_internal.h> |
---|
| 29 | +#include <backend/gpu/mali_kbase_model_linux.h> |
---|
29 | 30 | #include <mali_kbase_dummy_job_wa.h> |
---|
30 | 31 | |
---|
31 | 32 | int kbase_pm_ca_init(struct kbase_device *kbdev) |
---|
.. | .. |
---|
52 | 53 | { |
---|
53 | 54 | struct kbase_pm_backend_data *pm_backend = &kbdev->pm.backend; |
---|
54 | 55 | unsigned long flags; |
---|
| 56 | +#if MALI_USE_CSF |
---|
| 57 | + u64 old_core_mask = 0; |
---|
| 58 | +#endif |
---|
55 | 59 | |
---|
56 | 60 | spin_lock_irqsave(&kbdev->hwaccess_lock, flags); |
---|
57 | 61 | |
---|
.. | .. |
---|
62 | 66 | core_mask, kbdev->pm.debug_core_mask); |
---|
63 | 67 | goto unlock; |
---|
64 | 68 | } |
---|
| 69 | + |
---|
| 70 | + old_core_mask = pm_backend->ca_cores_enabled; |
---|
65 | 71 | #else |
---|
66 | 72 | if (!(core_mask & kbdev->pm.debug_core_mask_all)) { |
---|
67 | 73 | dev_err(kbdev->dev, "OPP core mask 0x%llX does not intersect with debug mask 0x%llX\n", |
---|
.. | .. |
---|
70 | 76 | } |
---|
71 | 77 | |
---|
72 | 78 | 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"); |
---|
74 | 80 | goto unlock; |
---|
75 | 81 | } |
---|
76 | 82 | #endif /* MALI_USE_CSF */ |
---|
77 | | - |
---|
78 | 83 | pm_backend->ca_cores_enabled = core_mask; |
---|
79 | 84 | |
---|
80 | 85 | kbase_pm_update_state(kbdev); |
---|
81 | | - |
---|
82 | | -unlock: |
---|
83 | 86 | 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 |
---|
84 | 100 | |
---|
85 | 101 | dev_dbg(kbdev->dev, "Devfreq policy : new core mask=%llX\n", |
---|
86 | 102 | pm_backend->ca_cores_enabled); |
---|
| 103 | + |
---|
| 104 | + return; |
---|
| 105 | +unlock: |
---|
| 106 | + spin_unlock_irqrestore(&kbdev->hwaccess_lock, flags); |
---|
87 | 107 | } |
---|
88 | 108 | KBASE_EXPORT_TEST_API(kbase_devfreq_set_core_mask); |
---|
89 | 109 | #endif |
---|
.. | .. |
---|
120 | 140 | { |
---|
121 | 141 | lockdep_assert_held(&kbdev->hwaccess_lock); |
---|
122 | 142 | |
---|
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 |
---|
124 | 146 | return kbase_pm_get_ready_cores(kbdev, KBASE_PM_CORE_SHADER); |
---|
125 | 147 | #else |
---|
126 | 148 | return kbdev->pm.backend.pm_shaders_core_mask; |
---|