/** 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);
}
Ejemplo n.º 2
0
/** Turn some cores on/off.
 *
 * This function turns on/off the cores needed by the scheduler.
 */
static void demand_change_gpu_state(kbase_device *kbdev)
{
	/* Update the bitmap of the cores we need */
	kbdev->pm.desired_shader_state = kbdev->shader_needed_bitmap;
	kbdev->pm.desired_tiler_state = kbdev->tiler_needed_bitmap;

	kbase_pm_check_transitions(kbdev);
}
Ejemplo n.º 3
0
/** 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;
}
Ejemplo n.º 4
0
/** 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);
}
/** The event callback function for the always_on power policy.
 *
 * This function is called to handle the events for the power policy. It calls the relevant handler function depending
 * on the type of the event.
 *
 * @param kbdev     The kbase device structure for the device
 * @param event     The event that should be processed
 */
static void always_on_event(kbase_device *kbdev, kbase_pm_event event)
{
	kbasep_pm_policy_always_on *data = &kbdev->pm.policy_data.always_on;

	switch (event) {
	case KBASE_PM_EVENT_SYSTEM_SUSPEND:
		always_on_suspend(kbdev);
		break;
	case KBASE_PM_EVENT_POLICY_INIT:	/* Init is the same as resume for this policy */
	case KBASE_PM_EVENT_SYSTEM_RESUME:
		always_on_resume(kbdev);
		break;
	case KBASE_PM_EVENT_GPU_STATE_CHANGED:
		always_on_state_changed(kbdev);
		break;
	case KBASE_PM_EVENT_POLICY_CHANGE:
		if (data->state == KBASEP_PM_ALWAYS_ON_STATE_POWERED_UP || data->state == KBASEP_PM_ALWAYS_ON_STATE_POWERED_DOWN)
			kbase_pm_change_policy(kbdev);
		else
			data->state = KBASEP_PM_ALWAYS_ON_STATE_CHANGING_POLICY;
		break;
	case KBASE_PM_EVENT_GPU_ACTIVE:
	case KBASE_PM_EVENT_GPU_IDLE:
		break;
	case KBASE_PM_EVENT_CHANGE_GPU_STATE:
		/*
		 * Note that the GPU is always kept on, however we still may
		 * be required to update anyone waiting for power up events.
		 */
		kbase_pm_check_transitions(kbdev);
		break;
	default:
		/* Unrecognised event - this should never happen */
		KBASE_DEBUG_ASSERT(0);
	}
}
/** The event callback function for the coarse_demand power policy.
 *
 * This function is called to handle the events for the power policy. It calls the relevant handler function depending
 * on the type of the event.
 *
 * @param kbdev     The kbase device structure for the device
 * @param event     The event that should be processed
 */
static void coarse_demand_event(kbase_device *kbdev, kbase_pm_event event)
{
	kbasep_pm_policy_coarse_demand *data = &kbdev->pm.policy_data.coarse_demand;

	switch(event)
	{
	case KBASE_PM_EVENT_POLICY_INIT:
		coarse_demand_power_up(kbdev);
		break;
	case KBASE_PM_EVENT_SYSTEM_SUSPEND:
		switch (data->state)
		{
			case KBASEP_PM_COARSE_DEMAND_STATE_POWERING_DOWN:
				break;
			case KBASEP_PM_COARSE_DEMAND_STATE_POWERED_DOWN:
				kbase_pm_power_down_done(kbdev);
				break;
			default:
				coarse_demand_suspend(kbdev);
		}
		break;
	case KBASE_PM_EVENT_GPU_IDLE:
		switch (data->state)
		{
			case KBASEP_PM_COARSE_DEMAND_STATE_POWERING_DOWN:
				break;
			case KBASEP_PM_COARSE_DEMAND_STATE_POWERED_DOWN:
				kbase_pm_power_down_done(kbdev);
				break;
			default:
				coarse_demand_power_down(kbdev);
		}
		break;
	case KBASE_PM_EVENT_GPU_ACTIVE:
	case KBASE_PM_EVENT_SYSTEM_RESUME:
		switch (data->state)
		{
			case KBASEP_PM_COARSE_DEMAND_STATE_POWERING_UP:
				break;
			case KBASEP_PM_COARSE_DEMAND_STATE_POWERED_UP:
				kbase_pm_power_up_done(kbdev);
				break;
			default:
				coarse_demand_power_up(kbdev);
		}
		break;
	case KBASE_PM_EVENT_GPU_STATE_CHANGED:
		coarse_demand_state_changed(kbdev);
		break;
	case KBASE_PM_EVENT_POLICY_CHANGE:
		if (data->state == KBASEP_PM_COARSE_DEMAND_STATE_POWERED_UP ||
		    data->state == KBASEP_PM_COARSE_DEMAND_STATE_POWERED_DOWN)
		{
			kbase_pm_change_policy(kbdev);
		}
		else
		{
			data->state = KBASEP_PM_COARSE_DEMAND_STATE_CHANGING_POLICY;
		}
		break;
	case KBASE_PM_EVENT_CHANGE_GPU_STATE:
		if (data->state != KBASEP_PM_COARSE_DEMAND_STATE_POWERED_DOWN &&
			data->state != KBASEP_PM_COARSE_DEMAND_STATE_POWERING_DOWN)
		{
			/*
			 * Update anyone waiting for power up events.
			 */
			kbase_pm_check_transitions(kbdev);
		}
		break;
	default:
		/* Unrecognised event - this should never happen */
		OSK_ASSERT(0);
	}
}