Beispiel #1
0
GED_ERROR ged_dvfs_system_init()
{
	mutex_init(&gsDVFSLock);
	mutex_init(&gsVSyncOffsetLock);

	// initial as locked, signal when vsync_sw_notify    

	g_iSkipCount = MTK_DEFER_DVFS_WORK_MS / MTK_DVFS_SWITCH_INTERVAL_MS;

	g_ulvsync_period = get_ns_period_from_fps(60);


#ifdef GED_DVFS_ENABLE
	gpu_dvfs_enable = 1;
#else
	gpu_dvfs_enable = 0;
#endif	

	g_dvfs_skip_round = 0;

#ifdef GED_DVFS_ENABLE	
	g_bottom_freq_id = mt_gpufreq_get_dvfs_table_num() - 1; 
	gpu_bottom_freq = mt_gpufreq_get_freq_by_idx(g_bottom_freq_id);

	g_cust_boost_freq_id = mt_gpufreq_get_dvfs_table_num() - 1;
	gpu_cust_boost_freq = mt_gpufreq_get_freq_by_idx(g_cust_boost_freq_id);

	g_cust_upbound_freq_id = 0;
	gpu_cust_upbound_freq = mt_gpufreq_get_freq_by_idx(g_cust_upbound_freq_id);



	// GPU HAL fp mount	
	//mt_gpufreq_input_boost_notify_registerCB(ged_dvfs_freq_input_boostCB); // MTKFreqInputBoostCB
	mt_gpufreq_power_limit_notify_registerCB(ged_dvfs_freq_thermal_limitCB); // MTKFreqPowerLimitCB
	mtk_boost_gpu_freq_fp = ged_dvfs_boost_gpu_freq;
	mtk_set_bottom_gpu_freq_fp = ged_dvfs_set_bottom_gpu_freq;
	mtk_get_bottom_gpu_freq_fp = ged_dvfs_get_bottom_gpu_freq;
	mtk_custom_get_gpu_freq_level_count_fp = ged_dvfs_get_gpu_freq_level_count;
	mtk_custom_boost_gpu_freq_fp = ged_dvfs_custom_boost_gpu_freq;
	mtk_custom_upbound_gpu_freq_fp = ged_dvfs_custom_ceiling_gpu_freq;
	mtk_get_custom_boost_gpu_freq_fp = ged_dvfs_get_custom_boost_gpu_freq;
	mtk_get_custom_upbound_gpu_freq_fp = ged_dvfs_get_custom_ceiling_gpu_freq;
	mtk_get_gpu_loading_fp = ged_dvfs_get_gpu_loading;
	mtk_get_gpu_block_fp = ged_dvfs_get_gpu_blocking;
	mtk_get_gpu_idle_fp = ged_dvfs_get_gpu_idle;
	mtk_do_gpu_dvfs_fp = ged_dvfs_run;
	mtk_gpu_dvfs_set_mode_fp = ged_dvfs_set_tuning_mode_wrap;
#endif	

	return GED_OK;
}
void mali_pmm_init(void)
{
    MALI_DEBUG_PRINT(4, ("%s\n", __FUNCTION__));

#if MALI_LICENSE_IS_GPL
#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,36))
#if LINUX_VERSION_CODE < KERNEL_VERSION(3,18,0)    
    mali_dvfs_queue = alloc_workqueue("mali_dvfs", WQ_NON_REENTRANT | WQ_UNBOUND | WQ_HIGHPRI, 0);
#else
    mali_dvfs_queue = alloc_workqueue("mali_dvfs", WQ_UNBOUND | WQ_HIGHPRI, 0);
#endif
#else
    mali_dvfs_queue = create_workqueue("mali_dvfs");
#endif

    INIT_WORK(&mali_dvfs_work, mali_dvfs_handler);
#endif // MALI_LICENSE_IS_GPL

    atomic_set(&g_current_frequency_id, 0);
    atomic_set(&g_boost_frequency_id, 0);
    atomic_set(&g_perf_hal_frequency_id, 4);
    atomic_set(&g_ged_hal_frequency_id, 4); 
    atomic_set(&g_current_deferred_count, 0);
    atomic_set(&g_input_boost_enabled, 1);
    atomic_set(&g_input_boost_duration, 0);
    atomic_set(&g_dvfs_threshold_min, 32);
    atomic_set(&g_dvfs_threshold_max, 45);
    atomic_set(&g_dvfs_deferred_count, 0);
    atomic_set(&g_is_power_enabled, 0);

	/* MTK Register input boost and power limit call back function */
	mt_gpufreq_input_boost_notify_registerCB(mtk_gpu_input_boost_callback);
	mt_gpufreq_power_limit_notify_registerCB(mtk_gpu_power_limit_callback);

	/* Register gpu boost function to MTK HAL */
	mtk_boost_gpu_freq_fp                  = mtk_touch_boost_gpu_freq;
	mtk_custom_boost_gpu_freq_fp           = mtk_perf_hal_callback; /* used for for performance service boost */
    mtk_set_bottom_gpu_freq_fp             = mtk_ged_hal_callback; /* used for GED boost */
	mtk_custom_get_gpu_freq_level_count_fp = mtk_get_freq_level_count;
    mtk_get_gpu_loading_fp                 = mtk_get_mali_utilization;
    mtk_gpu_sodi_entry_fp                  = mali_set_mali_SODI_begin;
    mtk_gpu_sodi_exit_fp                   = mali_set_mali_SODI_exit;
}
mali_error kbase_pm_init(struct kbase_device *kbdev)
{
	mali_error ret = MALI_ERROR_NONE;
	struct kbase_pm_callback_conf *callbacks;

	KBASE_DEBUG_ASSERT(kbdev != NULL);

	mutex_init(&kbdev->pm.lock);

	kbdev->pm.gpu_powered = MALI_FALSE;
	kbdev->pm.suspending = MALI_FALSE;
#ifdef CONFIG_MALI_DEBUG
	kbdev->pm.driver_ready_for_irqs = MALI_FALSE;
#endif /* CONFIG_MALI_DEBUG */
	kbdev->pm.gpu_in_desired_state = MALI_TRUE;
	init_waitqueue_head(&kbdev->pm.gpu_in_desired_state_wait);

	callbacks = (struct kbase_pm_callback_conf *)kbasep_get_config_value(kbdev, kbdev->config_attributes, KBASE_CONFIG_ATTR_POWER_MANAGEMENT_CALLBACKS);
	if (callbacks) {
		kbdev->pm.callback_power_on = callbacks->power_on_callback;
		kbdev->pm.callback_power_off = callbacks->power_off_callback;
		kbdev->pm.callback_power_suspend =
					callbacks->power_suspend_callback;
		kbdev->pm.callback_power_resume =
					callbacks->power_resume_callback;
		kbdev->pm.callback_power_runtime_init = callbacks->power_runtime_init_callback;
		kbdev->pm.callback_power_runtime_term = callbacks->power_runtime_term_callback;
		kbdev->pm.callback_power_runtime_on = callbacks->power_runtime_on_callback;
		kbdev->pm.callback_power_runtime_off = callbacks->power_runtime_off_callback;
	} else {
		kbdev->pm.callback_power_on = NULL;
		kbdev->pm.callback_power_off = NULL;
		kbdev->pm.callback_power_suspend = NULL;
		kbdev->pm.callback_power_resume = NULL;
		kbdev->pm.callback_power_runtime_init = NULL;
		kbdev->pm.callback_power_runtime_term = NULL;
		kbdev->pm.callback_power_runtime_on = NULL;
		kbdev->pm.callback_power_runtime_off = NULL;
	}

	/* MTK GPU DVFS init */
	_mtk_gpu_dvfs_init();

	/* MTK Register input boost and power limit call back function */
	mt_gpufreq_input_boost_notify_registerCB(mtk_gpu_input_boost_CB);
	mt_gpufreq_power_limit_notify_registerCB(mtk_gpu_power_limit_CB);

	/* Register gpu boost function to MTK HAL */
	mtk_boost_gpu_freq_fp = mtk_kbase_boost_gpu_freq;
	mtk_custom_boost_gpu_freq_fp = mtk_kbase_custom_boost_gpu_freq; /* used for for performance service boost */
    mtk_set_bottom_gpu_freq_fp = mtk_kbase_ged_bottom_gpu_freq; /* used for GED boost */
	mtk_custom_get_gpu_freq_level_count_fp = mtk_kbase_custom_get_gpu_freq_level_count;

	/* MTK MET use */
	mtk_get_gpu_loading_fp = kbasep_get_gl_utilization;

	kbdev->pm.platform_dvfs_frequency = (u32) kbasep_get_config_value(kbdev, kbdev->config_attributes, KBASE_CONFIG_ATTR_POWER_MANAGEMENT_DVFS_FREQ);

	/* Initialise the metrics subsystem */
	ret = kbasep_pm_metrics_init(kbdev);
	if (MALI_ERROR_NONE != ret)
		return ret;

	init_waitqueue_head(&kbdev->pm.l2_powered_wait);
	kbdev->pm.l2_powered = 0;

	init_waitqueue_head(&kbdev->pm.reset_done_wait);
	kbdev->pm.reset_done = MALI_FALSE;

	init_waitqueue_head(&kbdev->pm.zero_active_count_wait);
	kbdev->pm.active_count = 0;

	spin_lock_init(&kbdev->pm.power_change_lock);
	spin_lock_init(&kbdev->pm.gpu_cycle_counter_requests_lock);
	spin_lock_init(&kbdev->pm.gpu_powered_lock);

	if (MALI_ERROR_NONE != kbase_pm_ca_init(kbdev))
		goto workq_fail;

	if (MALI_ERROR_NONE != kbase_pm_policy_init(kbdev))
		goto pm_policy_fail;

	return MALI_ERROR_NONE;

pm_policy_fail:
	kbase_pm_ca_term(kbdev);
workq_fail:
	kbasep_pm_metrics_term(kbdev);
	return MALI_ERROR_FUNCTION_FAILED;
}