static void gpu_dvfs_update_utilization(struct kbase_device *kbdev) { unsigned long flags; struct exynos_context *platform = (struct exynos_context *) kbdev->platform_context; DVFS_ASSERT(platform); #if defined(CONFIG_MALI_DVFS) && defined(CONFIG_CPU_THERMAL_IPA) if (platform->time_tick < platform->gpu_dvfs_time_interval) { platform->time_tick++; platform->time_busy += kbdev->pm.metrics.time_busy; platform->time_idle += kbdev->pm.metrics.time_idle; } else { platform->time_busy = kbdev->pm.metrics.time_busy; platform->time_idle = kbdev->pm.metrics.time_idle; platform->time_tick = 0; } #endif /* CONFIG_MALI_DVFS && CONFIG_CPU_THERMAL_IPA */ spin_lock_irqsave(&platform->gpu_dvfs_spinlock, flags); #if SLSI_INTEGRATION /* Temporary patch */ platform->env_data.utilization = kbase_pm_get_dvfs_utilisation(kbdev, 0, 0); #else platform->env_data.utilization = kbase_platform_dvfs_event(kbdev, 0); #endif spin_unlock_irqrestore(&platform->gpu_dvfs_spinlock, flags); #if defined(CONFIG_MALI_DVFS) && defined(CONFIG_CPU_THERMAL_IPA) gpu_ipa_dvfs_calc_norm_utilisation(kbdev); #endif /* CONFIG_MALI_DVFS && CONFIG_CPU_THERMAL_IPA */ }
static void dvfs_callback(void *data) { kbase_device *kbdev; kbase_pm_dvfs_action action; osk_error ret; OSK_ASSERT(data != NULL); kbdev = (kbase_device*)data; #ifdef CONFIG_VITHAR_DVFS CSTD_UNUSED(action); kbase_platform_dvfs_event(kbdev, kbase_pm_get_dvfs_utilisation(kbdev)); #else action = kbase_pm_get_dvfs_action(kbdev); switch(action) { case KBASE_PM_DVFS_NOP: break; case KBASE_PM_DVFS_CLOCK_UP: /* Do whatever is required to increase the clock frequency */ break; case KBASE_PM_DVFS_CLOCK_DOWN: /* Do whatever is required to decrease the clock frequency */ break; } #endif osk_spinlock_irq_lock(&kbdev->pm.metrics.lock); if (kbdev->pm.metrics.timer_active) { ret = osk_timer_start(&kbdev->pm.metrics.timer, KBASE_PM_DVFS_FREQUENCY); if (ret != OSK_ERR_NONE) { /* Handle the situation where the timer cannot be restarted */ } } osk_spinlock_irq_unlock(&kbdev->pm.metrics.lock); }