| .. | .. |
|---|
| 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; |
|---|