/** Function to handle the @ref KBASE_PM_EVENT_SYSTEM_RESUME message for the always_on power policy. * * This function is called when a @ref KBASE_PM_EVENT_SYSTEM_RESUME message is received. It instructs the GPU to turn on all * the cores. * * @param kbdev The kbase device structure for the device */ static void always_on_resume(kbase_device *kbdev) { u64 cores; /* Inform the system that the transition has started */ kbase_pm_power_transitioning(kbdev); /* Turn the clock on */ kbase_pm_clock_on(kbdev); /* Enable interrupts */ kbase_pm_enable_interrupts(kbdev); /* Turn the cores on */ cores = kbase_pm_get_present_cores(kbdev, KBASE_PM_CORE_SHADER); kbase_pm_invoke_power_up(kbdev, KBASE_PM_CORE_SHADER, cores); cores = kbase_pm_get_present_cores(kbdev, KBASE_PM_CORE_TILER); kbase_pm_invoke_power_up(kbdev, KBASE_PM_CORE_TILER, cores); kbase_pm_check_transitions(kbdev); kbdev->pm.policy_data.always_on.state = KBASEP_PM_ALWAYS_ON_STATE_POWERING_UP; /* Ensure that the OS is informed even if we didn't do anything */ always_on_state_changed(kbdev); }
mali_error kbase_pm_powerup(struct kbase_device *kbdev) { unsigned long flags; mali_error ret; KBASE_DEBUG_ASSERT(kbdev != NULL); mutex_lock(&kbdev->pm.lock); /* A suspend won't happen during startup/insmod */ KBASE_DEBUG_ASSERT(!kbase_pm_is_suspending(kbdev)); /* MALI_SEC_INTEGRATION */ /* while the GPU initialization, vendor desired gpu log will be out by set_power_dbg(FALSE) calls */ if(kbdev->vendor_callbacks->set_poweron_dbg) kbdev->vendor_callbacks->set_poweron_dbg(FALSE); /* Power up the GPU, don't enable IRQs as we are not ready to receive them. */ ret = kbase_pm_init_hw(kbdev, MALI_FALSE); if (ret != MALI_ERROR_NONE) { mutex_unlock(&kbdev->pm.lock); return ret; } kbasep_pm_read_present_cores(kbdev); kbdev->pm.debug_core_mask = kbdev->shader_present_bitmap; /* Pretend the GPU is active to prevent a power policy turning the GPU cores off */ kbdev->pm.active_count = 1; spin_lock_irqsave(&kbdev->pm.gpu_cycle_counter_requests_lock, flags); /* Ensure cycle counter is off */ kbdev->pm.gpu_cycle_counter_requests = 0; spin_unlock_irqrestore(&kbdev->pm.gpu_cycle_counter_requests_lock, flags); /* We are ready to receive IRQ's now as power policy is set up, so enable them now. */ #ifdef CONFIG_MALI_DEBUG spin_lock_irqsave(&kbdev->pm.gpu_powered_lock, flags); kbdev->pm.driver_ready_for_irqs = MALI_TRUE; spin_unlock_irqrestore(&kbdev->pm.gpu_powered_lock, flags); #endif kbase_pm_enable_interrupts(kbdev); /* Turn on the GPU and any cores needed by the policy */ kbase_pm_do_poweron(kbdev, MALI_FALSE); mutex_unlock(&kbdev->pm.lock); /* MALI_SEC_INTEGRATION */ if(kbdev->vendor_callbacks->hwcnt_init) kbdev->vendor_callbacks->hwcnt_init(kbdev); /* Idle the GPU and/or cores, if the policy wants it to */ kbase_pm_context_idle(kbdev); return MALI_ERROR_NONE; }
/** Turns the cores on. * * This function turns all the cores of the GPU on. */ static void demand_power_up(kbase_device *kbdev) { /* Inform the system that the transition has started */ kbase_pm_power_transitioning(kbdev); /* Turn clocks and interrupts on */ kbase_pm_clock_on(kbdev); kbase_pm_enable_interrupts(kbdev); kbase_pm_check_transitions(kbdev); kbdev->pm.policy_data.demand.state = KBASEP_PM_DEMAND_STATE_POWERING_UP; }
mali_error kbase_pm_powerup(kbase_device *kbdev) { unsigned long flags; mali_error ret; KBASE_DEBUG_ASSERT(kbdev != NULL); mutex_lock(&kbdev->pm.lock); /* A suspend won't happen during startup/insmod */ KBASE_DEBUG_ASSERT(!kbase_pm_is_suspending(kbdev)); /* Power up the GPU, don't enable IRQs as we are not ready to receive them. */ ret = kbase_pm_init_hw(kbdev, MALI_FALSE ); if (ret != MALI_ERROR_NONE) { mutex_unlock(&kbdev->pm.lock); return ret; } kbasep_pm_read_present_cores(kbdev); kbdev->pm.debug_core_mask = kbdev->shader_present_bitmap; /* Pretend the GPU is active to prevent a power policy turning the GPU cores off */ kbdev->pm.active_count = 1; spin_lock_irqsave(&kbdev->pm.gpu_cycle_counter_requests_lock, flags); /* Ensure cycle counter is off */ kbdev->pm.gpu_cycle_counter_requests = 0; kbase_reg_write(kbdev, GPU_CONTROL_REG(GPU_COMMAND), GPU_COMMAND_CYCLE_COUNT_STOP, NULL); spin_unlock_irqrestore(&kbdev->pm.gpu_cycle_counter_requests_lock, flags); /* We are ready to receive IRQ's now as power policy is set up, so enable them now. */ #ifdef CONFIG_MALI_DEBUG spin_lock_irqsave(&kbdev->pm.gpu_powered_lock, flags); kbdev->pm.driver_ready_for_irqs = MALI_TRUE; spin_unlock_irqrestore(&kbdev->pm.gpu_powered_lock, flags); #endif kbase_pm_enable_interrupts(kbdev); /* Turn on the GPU and any cores needed by the policy */ kbase_pm_do_poweron(kbdev); mutex_unlock(&kbdev->pm.lock); /* Idle the GPU and/or cores, if the policy wants it to */ kbase_pm_context_idle(kbdev); return MALI_ERROR_NONE; }