/** 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); }
void kbase_pm_do_poweron(kbase_device *kbdev, mali_bool is_resume) { volatile u64 cores_powered; int cnt = 0xFFFF; lockdep_assert_held(&kbdev->pm.lock); /* Turn clocks and interrupts on - no-op if we haven't done a previous * kbase_pm_clock_off() */ kbase_pm_clock_on(kbdev, is_resume); /* Update core status as required by the policy */ KBASE_TIMELINE_PM_CHECKTRANS(kbdev, SW_FLOW_PM_CHECKTRANS_PM_DO_POWERON_START); kbase_pm_update_cores_state(kbdev); KBASE_TIMELINE_PM_CHECKTRANS(kbdev, SW_FLOW_PM_CHECKTRANS_PM_DO_POWERON_END); /* NOTE: We don't wait to reach the desired state, since running atoms * will wait for that state to be reached anyway */ do { cores_powered = kbase_pm_get_ready_cores(kbdev, KBASE_PM_CORE_SHADER); cnt --; } while(((cores_powered & 0x3f) != 0x3f) && cnt > 0); if(cnt == 0) KBASE_TRACE_ADD_EXYNOS(kbdev, LSI_POWER_ON_COUNT_EXPIRED, NULL, NULL, 0u, 0u); if (kbdev->pm.callback_power_on_post) kbdev->pm.callback_power_on_post(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; }
void kbase_pm_do_poweron(kbase_device *kbdev) { lockdep_assert_held(&kbdev->pm.lock); /* Turn clocks and interrupts on - no-op if we haven't done a previous * kbase_pm_clock_off() */ kbase_pm_clock_on(kbdev); /* Update core status as required by the policy */ KBASE_TIMELINE_PM_CHECKTRANS(kbdev, SW_FLOW_PM_CHECKTRANS_PM_DO_POWERON_START); kbase_pm_update_cores_state(kbdev); KBASE_TIMELINE_PM_CHECKTRANS(kbdev, SW_FLOW_PM_CHECKTRANS_PM_DO_POWERON_END); /* NOTE: We don't wait to reach the desired state, since running atoms * will wait for that state to be reached anyway */ }