mali_error kbasep_pm_metrics_init(kbase_device *kbdev) { osk_error osk_err; mali_error ret; OSK_ASSERT(kbdev != NULL); kbdev->pm.metrics.vsync_hit = 0; kbdev->pm.metrics.utilisation = 0; kbdev->pm.metrics.time_period_start = osk_time_now(); kbdev->pm.metrics.time_busy = 0; kbdev->pm.metrics.time_idle = 0; kbdev->pm.metrics.gpu_active = MALI_TRUE; kbdev->pm.metrics.timer_active = MALI_TRUE; #ifdef CONFIG_VITHAR_RT_PM kbdev->pm.cmu_pmu_status = 0; #endif osk_err = osk_spinlock_irq_init(&kbdev->pm.metrics.lock, OSK_LOCK_ORDER_PM_METRICS); if (OSK_ERR_NONE != osk_err) { ret = MALI_ERROR_FUNCTION_FAILED; goto out; } osk_err = osk_timer_init(&kbdev->pm.metrics.timer); if (OSK_ERR_NONE != osk_err) { ret = MALI_ERROR_FUNCTION_FAILED; goto spinlock_free; } osk_timer_callback_set(&kbdev->pm.metrics.timer, dvfs_callback, kbdev); osk_err = osk_timer_start(&kbdev->pm.metrics.timer, KBASE_PM_DVFS_FREQUENCY); if (OSK_ERR_NONE != osk_err) { ret = MALI_ERROR_FUNCTION_FAILED; goto timer_free; } kbase_pm_register_vsync_callback(kbdev); ret = MALI_ERROR_NONE; goto out; timer_free: osk_timer_stop(&kbdev->pm.metrics.timer); osk_timer_term(&kbdev->pm.metrics.timer); spinlock_free: osk_spinlock_irq_term(&kbdev->pm.metrics.lock); out: return ret; }
mali_error kbasep_js_devdata_init( kbase_device *kbdev ) { kbasep_js_device_data *js_devdata; mali_error err; int i; u16 as_present; osk_error osk_err; OSK_ASSERT( kbdev != NULL ); js_devdata = &kbdev->js_data; as_present = (1U << kbdev->nr_address_spaces) - 1; OSK_ASSERT( js_devdata->init_status == JS_DEVDATA_INIT_NONE ); js_devdata->nr_contexts_running = 0; js_devdata->as_free = as_present; /* All ASs initially free */ js_devdata->runpool_irq.nr_nss_ctxs_running = 0; js_devdata->runpool_irq.nr_permon_jobs_submitted = 0; js_devdata->runpool_irq.submit_allowed = 0u; /* No ctx allowed to submit */ /* Config attributes */ js_devdata->scheduling_tick_ns = (u32)kbasep_get_config_value( kbdev->config_attributes, KBASE_CONFIG_ATTR_JS_SCHEDULING_TICK_NS ); js_devdata->soft_stop_ticks = (u32)kbasep_get_config_value( kbdev->config_attributes, KBASE_CONFIG_ATTR_JS_SOFT_STOP_TICKS ); js_devdata->hard_stop_ticks_ss = (u32)kbasep_get_config_value( kbdev->config_attributes, KBASE_CONFIG_ATTR_JS_HARD_STOP_TICKS_SS ); js_devdata->hard_stop_ticks_nss = (u32)kbasep_get_config_value( kbdev->config_attributes, KBASE_CONFIG_ATTR_JS_HARD_STOP_TICKS_NSS ); js_devdata->gpu_reset_ticks_ss = (u32)kbasep_get_config_value( kbdev->config_attributes, KBASE_CONFIG_ATTR_JS_RESET_TICKS_SS ); js_devdata->gpu_reset_ticks_nss = (u32)kbasep_get_config_value( kbdev->config_attributes, KBASE_CONFIG_ATTR_JS_RESET_TICKS_NSS ); js_devdata->ctx_timeslice_ns = (u32)kbasep_get_config_value( kbdev->config_attributes, KBASE_CONFIG_ATTR_JS_CTX_TIMESLICE_NS ); js_devdata->cfs_ctx_runtime_init_slices = (u32)kbasep_get_config_value( kbdev->config_attributes, KBASE_CONFIG_ATTR_JS_CFS_CTX_RUNTIME_INIT_SLICES ); js_devdata->cfs_ctx_runtime_min_slices = (u32)kbasep_get_config_value( kbdev->config_attributes, KBASE_CONFIG_ATTR_JS_CFS_CTX_RUNTIME_MIN_SLICES ); OSK_PRINT_INFO( OSK_BASE_JM, "JS Config Attribs: " ); OSK_PRINT_INFO( OSK_BASE_JM, "\tjs_devdata->scheduling_tick_ns:%d", js_devdata->scheduling_tick_ns ); OSK_PRINT_INFO( OSK_BASE_JM, "\tjs_devdata->soft_stop_ticks:%d", js_devdata->soft_stop_ticks ); OSK_PRINT_INFO( OSK_BASE_JM, "\tjs_devdata->hard_stop_ticks_ss:%d", js_devdata->hard_stop_ticks_ss ); OSK_PRINT_INFO( OSK_BASE_JM, "\tjs_devdata->hard_stop_ticks_nss:%d", js_devdata->hard_stop_ticks_nss ); OSK_PRINT_INFO( OSK_BASE_JM, "\tjs_devdata->gpu_reset_ticks_ss:%d", js_devdata->gpu_reset_ticks_ss ); OSK_PRINT_INFO( OSK_BASE_JM, "\tjs_devdata->gpu_reset_ticks_nss:%d", js_devdata->gpu_reset_ticks_nss ); OSK_PRINT_INFO( OSK_BASE_JM, "\tjs_devdata->ctx_timeslice_ns:%d", js_devdata->ctx_timeslice_ns ); OSK_PRINT_INFO( OSK_BASE_JM, "\tjs_devdata->cfs_ctx_runtime_init_slices:%d", js_devdata->cfs_ctx_runtime_init_slices ); OSK_PRINT_INFO( OSK_BASE_JM, "\tjs_devdata->cfs_ctx_runtime_min_slices:%d", js_devdata->cfs_ctx_runtime_min_slices ); #if MALI_BACKEND_KERNEL /* Only output on real kernel modules, otherwise it fills up multictx testing output */ #if KBASE_DISABLE_SCHEDULING_SOFT_STOPS != 0 OSK_PRINT( OSK_BASE_JM, "Job Scheduling Policy Soft-stops disabled, ignoring value for soft_stop_ticks==%d at %dns per tick. Other soft-stops may still occur.", js_devdata->soft_stop_ticks, js_devdata->scheduling_tick_ns ); #endif #if KBASE_DISABLE_SCHEDULING_HARD_STOPS != 0 OSK_PRINT( OSK_BASE_JM, "Job Scheduling Policy Hard-stops disabled, ignoring values for hard_stop_ticks_ss==%d and hard_stop_ticks_nss==%d at %dns per tick. Other hard-stops may still occur.", js_devdata->hard_stop_ticks_ss, js_devdata->hard_stop_ticks_nss, js_devdata->scheduling_tick_ns ); #endif #if KBASE_DISABLE_SCHEDULING_SOFT_STOPS != 0 && KBASE_DISABLE_SCHEDULING_HARD_STOPS != 0 OSK_PRINT( OSK_BASE_JM, "Note: The JS policy's tick timer (if coded) will still be run, but do nothing." ); #endif #endif /* MALI_BACKEND_KERNEL */ /* setup the number of irq throttle cycles base on given time */ { u32 irq_throttle_time_us = kbdev->gpu_props.irq_throttle_time_us; u32 irq_throttle_cycles = kbasep_js_convert_us_to_gpu_ticks_max_freq(kbdev, irq_throttle_time_us); osk_atomic_set( &kbdev->irq_throttle_cycles, irq_throttle_cycles); } /* Clear the AS data, including setting NULL pointers */ OSK_MEMSET( &js_devdata->runpool_irq.per_as_data[0], 0, sizeof(js_devdata->runpool_irq.per_as_data) ); for ( i = 0; i < kbdev->nr_job_slots; ++i ) { js_devdata->js_reqs[i] = core_reqs_from_jsn_features( kbdev->job_slot_features[i] ); } js_devdata->init_status |= JS_DEVDATA_INIT_CONSTANTS; /* On error, we could continue on: providing none of the below resources * rely on the ones above */ osk_err = osk_mutex_init( &js_devdata->runpool_mutex, OSK_LOCK_ORDER_JS_RUNPOOL ); if ( osk_err == OSK_ERR_NONE ) { js_devdata->init_status |= JS_DEVDATA_INIT_RUNPOOL_MUTEX; } osk_err = osk_mutex_init( &js_devdata->queue_mutex, OSK_LOCK_ORDER_JS_QUEUE ); if ( osk_err == OSK_ERR_NONE ) { js_devdata->init_status |= JS_DEVDATA_INIT_QUEUE_MUTEX; } osk_err = osk_spinlock_irq_init( &js_devdata->runpool_irq.lock, OSK_LOCK_ORDER_JS_RUNPOOL_IRQ ); if ( osk_err == OSK_ERR_NONE ) { js_devdata->init_status |= JS_DEVDATA_INIT_RUNPOOL_IRQ_LOCK; } err = kbasep_js_policy_init( kbdev ); if ( err == MALI_ERROR_NONE) { js_devdata->init_status |= JS_DEVDATA_INIT_POLICY; } /* On error, do no cleanup; this will be handled by the caller(s), since * we've designed this resource to be safe to terminate on init-fail */ if ( js_devdata->init_status != JS_DEVDATA_INIT_ALL) { return MALI_ERROR_FUNCTION_FAILED; } return MALI_ERROR_NONE; }