struct mali_pmu_core *mali_pmu_create(_mali_osk_resource_t *resource) { struct mali_pmu_core* pmu; MALI_DEBUG_ASSERT(NULL == mali_global_pmu_core); MALI_DEBUG_PRINT(2, ("Mali PMU: Creating Mali PMU core\n")); pmu = (struct mali_pmu_core *)_mali_osk_malloc(sizeof(struct mali_pmu_core)); if (NULL != pmu) { pmu->lock = _mali_osk_spinlock_init(_MALI_OSK_LOCKFLAG_ORDERED, _MALI_OSK_LOCK_ORDER_PMU); if (NULL != pmu->lock) { pmu->registered_cores_mask = mali_pmu_detect_mask(); pmu->active_cores_mask = pmu->registered_cores_mask; if (_MALI_OSK_ERR_OK == mali_hw_core_create(&pmu->hw_core, resource, PMU_REGISTER_ADDRESS_SPACE_SIZE)) { _mali_osk_errcode_t err; struct _mali_osk_device_data data = { 0, }; err = _mali_osk_device_data_get(&data); if (_MALI_OSK_ERR_OK == err) { pmu->switch_delay = data.pmu_switch_delay; mali_global_pmu_core = pmu; return pmu; } mali_hw_core_delete(&pmu->hw_core); } _mali_osk_spinlock_term(pmu->lock); } _mali_osk_free(pmu); } return NULL; }
_mali_osk_errcode_t mali_dvfs_policy_init(void) { _mali_osk_device_data data; _mali_osk_errcode_t err = _MALI_OSK_ERR_OK; if (_MALI_OSK_ERR_OK == _mali_osk_device_data_get(&data)) { if ((NULL != data.get_clock_info) && (NULL != data.set_freq) && (NULL != data.get_freq)) { MALI_DEBUG_PRINT(2, ("Mali DVFS init: using arm dvfs policy \n")); mali_fps_step1 = mali_max_system_fps / 3; mali_fps_step2 = mali_max_system_fps / 5; data.get_clock_info(&gpu_clk); if (gpu_clk != NULL) { #ifdef DEBUG int i; for (i = 0; i < gpu_clk->num_of_steps; i++) { MALI_DEBUG_PRINT(5, ("mali gpu clock info: step%d clock(%d)Hz,vol(%d) \n", i, gpu_clk->item[i].clock, gpu_clk->item[i].vol)); } #endif } else { MALI_DEBUG_PRINT(2, ("Mali DVFS init: platform didn't define enough info for ddk to do DVFS \n")); } mali_gpu_get_freq = data.get_freq; mali_gpu_set_freq = data.set_freq; if ((NULL != gpu_clk) && (gpu_clk->num_of_steps > 0) && (NULL != mali_gpu_get_freq) && (NULL != mali_gpu_set_freq)) { mali_dvfs_enabled = MALI_TRUE; } } else { MALI_DEBUG_PRINT(2, ("Mali DVFS init: platform function callback incomplete, need check mali_gpu_device_data in platform .\n")); } } else { err = _MALI_OSK_ERR_FAULT; MALI_DEBUG_PRINT(2, ("Mali DVFS init: get platform data error .\n")); } return err; }
/* Init a timer (for now it is used for GPU utilization and dvfs) */ _mali_osk_errcode_t mali_control_timer_init(void) { _mali_osk_device_data data; if (_MALI_OSK_ERR_OK == _mali_osk_device_data_get(&data)) { /* Use device specific settings (if defined) */ if (0 != data.control_interval) { mali_control_timeout = data.control_interval; MALI_DEBUG_PRINT(2, ("Mali GPU Timer: %u\n", mali_control_timeout)); } } mali_control_timer = _mali_osk_timer_init(); if (NULL == mali_control_timer) { return _MALI_OSK_ERR_FAULT; } _mali_osk_timer_setcallback(mali_control_timer, mali_control_timer_callback, NULL); return _MALI_OSK_ERR_OK; }