/** 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); }
/** 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; }
/** Turn the cores off. * * This function turns all the cores of the GPU off. */ static void demand_power_down(kbase_device *kbdev) { u64 cores; /* Inform the system that the transition has started */ kbase_pm_power_transitioning(kbdev); /* Turn the cores off */ cores = kbase_pm_get_present_cores(kbdev, KBASE_PM_CORE_SHADER); kbase_pm_invoke_power_down(kbdev, KBASE_PM_CORE_SHADER, cores); cores = kbase_pm_get_present_cores(kbdev, KBASE_PM_CORE_TILER); kbase_pm_invoke_power_down(kbdev, KBASE_PM_CORE_TILER, cores); kbdev->pm.policy_data.demand.state = KBASEP_PM_DEMAND_STATE_POWERING_DOWN; kbase_pm_check_transitions(kbdev); }
mali_error kbase_pm_powerup(kbase_device *kbdev) { unsigned long flags; mali_error ret; OSK_ASSERT(kbdev != NULL); ret = kbase_pm_init_hw(kbdev); if (ret != MALI_ERROR_NONE) { return ret; } kbase_pm_power_transitioning(kbdev); kbasep_pm_read_present_cores(kbdev); /* Pretend the GPU is active to prevent a power policy turning the GPU cores off */ spin_lock_irqsave(&kbdev->pm.active_count_lock, flags); kbdev->pm.active_count = 1; spin_unlock_irqrestore(&kbdev->pm.active_count_lock, flags); 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); atomic_set(&kbdev->pm.pending_events, 0); atomic_set(&kbdev->pm.work_active, KBASE_PM_WORK_ACTIVE_STATE_INACTIVE); kbdev->pm.new_policy = NULL; kbdev->pm.current_policy = policy_list[0]; KBASE_TRACE_ADD( kbdev, PM_CURRENT_POLICY_INIT, NULL, NULL, 0u, kbdev->pm.current_policy->id ); kbdev->pm.current_policy->init(kbdev); kbase_pm_send_event(kbdev, KBASE_PM_EVENT_POLICY_INIT); /* Idle the GPU */ kbase_pm_context_idle(kbdev); return MALI_ERROR_NONE; }
/** Turn the GPU off. * * Turns the GPU off - assuming that no Job Chains are currently running on the GPU. */ static void coarse_demand_power_down(kbase_device *kbdev) { u64 cores; /* Inform the system that the transition has started */ kbase_pm_power_transitioning(kbdev); cores = kbase_pm_get_present_cores(kbdev, KBASE_PM_CORE_SHADER); kbase_pm_invoke_power_down(kbdev, KBASE_PM_CORE_SHADER, cores); cores = kbase_pm_get_present_cores(kbdev, KBASE_PM_CORE_TILER); kbase_pm_invoke_power_down(kbdev, KBASE_PM_CORE_TILER, cores); /* Note we don't call kbase_pm_check_transitions because we don't want to wait * for the above transitions to take place before turning the GPU power domain off */ kbdev->pm.policy_data.coarse_demand.state = KBASEP_PM_COARSE_DEMAND_STATE_POWERING_DOWN; /* Ensure that the OS is informed even if we didn't do anything */ coarse_demand_state_changed(kbdev); }