3 * (C) COPYRIGHT 2010-2016 ARM Limited. All rights reserved.
5 * This program is free software and is provided to you under the terms of the
6 * GNU General Public License version 2 as published by the Free Software
7 * Foundation, and any use by you of this program is subject to the terms
10 * A copy of the licence is included with the program, and can also be obtained
11 * from Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
12 * Boston, MA 02110-1301, USA.
19 * Power policy API implementations
22 #include <mali_kbase.h>
23 #include <mali_midg_regmap.h>
24 #include <mali_kbase_pm.h>
25 #include <mali_kbase_config_defaults.h>
26 #include <backend/gpu/mali_kbase_pm_internal.h>
28 static const struct kbase_pm_policy *const policy_list[] = {
29 #ifdef CONFIG_MALI_NO_MALI
30 &kbase_pm_always_on_policy_ops,
31 &kbase_pm_demand_policy_ops,
32 &kbase_pm_coarse_demand_policy_ops,
33 #if !MALI_CUSTOMER_RELEASE
34 &kbase_pm_demand_always_powered_policy_ops,
35 &kbase_pm_fast_start_policy_ops,
37 #else /* CONFIG_MALI_NO_MALI */
38 &kbase_pm_demand_policy_ops,
39 &kbase_pm_always_on_policy_ops,
40 &kbase_pm_coarse_demand_policy_ops,
41 #if !MALI_CUSTOMER_RELEASE
42 &kbase_pm_demand_always_powered_policy_ops,
43 &kbase_pm_fast_start_policy_ops,
45 #endif /* CONFIG_MALI_NO_MALI */
48 /* The number of policies available in the system.
49 * This is derived from the number of functions listed in policy_get_functions.
51 #define POLICY_COUNT (sizeof(policy_list)/sizeof(*policy_list))
54 /* Function IDs for looking up Timeline Trace codes in
55 * kbase_pm_change_state_trace_code */
56 enum kbase_pm_func_id {
57 KBASE_PM_FUNC_ID_REQUEST_CORES_START,
58 KBASE_PM_FUNC_ID_REQUEST_CORES_END,
59 KBASE_PM_FUNC_ID_RELEASE_CORES_START,
60 KBASE_PM_FUNC_ID_RELEASE_CORES_END,
61 /* Note: kbase_pm_unrequest_cores() is on the slow path, and we neither
62 * expect to hit it nor tend to hit it very much anyway. We can detect
63 * whether we need more instrumentation by a difference between
64 * PM_CHECKTRANS events and PM_SEND/HANDLE_EVENT. */
66 /* Must be the last */
67 KBASE_PM_FUNC_ID_COUNT
71 /* State changes during request/unrequest/release-ing cores */
73 KBASE_PM_CHANGE_STATE_SHADER = (1u << 0),
74 KBASE_PM_CHANGE_STATE_TILER = (1u << 1),
76 /* These two must be last */
77 KBASE_PM_CHANGE_STATE_MASK = (KBASE_PM_CHANGE_STATE_TILER |
78 KBASE_PM_CHANGE_STATE_SHADER),
79 KBASE_PM_CHANGE_STATE_COUNT = KBASE_PM_CHANGE_STATE_MASK + 1
81 typedef u32 kbase_pm_change_state;
84 #ifdef CONFIG_MALI_TRACE_TIMELINE
85 /* Timeline Trace code lookups for each function */
86 static u32 kbase_pm_change_state_trace_code[KBASE_PM_FUNC_ID_COUNT]
87 [KBASE_PM_CHANGE_STATE_COUNT] = {
88 /* kbase_pm_request_cores */
89 [KBASE_PM_FUNC_ID_REQUEST_CORES_START][0] = 0,
90 [KBASE_PM_FUNC_ID_REQUEST_CORES_START][KBASE_PM_CHANGE_STATE_SHADER] =
91 SW_FLOW_PM_CHECKTRANS_PM_REQUEST_CORES_SHADER_START,
92 [KBASE_PM_FUNC_ID_REQUEST_CORES_START][KBASE_PM_CHANGE_STATE_TILER] =
93 SW_FLOW_PM_CHECKTRANS_PM_REQUEST_CORES_TILER_START,
94 [KBASE_PM_FUNC_ID_REQUEST_CORES_START][KBASE_PM_CHANGE_STATE_SHADER |
95 KBASE_PM_CHANGE_STATE_TILER] =
96 SW_FLOW_PM_CHECKTRANS_PM_REQUEST_CORES_SHADER_TILER_START,
98 [KBASE_PM_FUNC_ID_REQUEST_CORES_END][0] = 0,
99 [KBASE_PM_FUNC_ID_REQUEST_CORES_END][KBASE_PM_CHANGE_STATE_SHADER] =
100 SW_FLOW_PM_CHECKTRANS_PM_REQUEST_CORES_SHADER_END,
101 [KBASE_PM_FUNC_ID_REQUEST_CORES_END][KBASE_PM_CHANGE_STATE_TILER] =
102 SW_FLOW_PM_CHECKTRANS_PM_REQUEST_CORES_TILER_END,
103 [KBASE_PM_FUNC_ID_REQUEST_CORES_END][KBASE_PM_CHANGE_STATE_SHADER |
104 KBASE_PM_CHANGE_STATE_TILER] =
105 SW_FLOW_PM_CHECKTRANS_PM_REQUEST_CORES_SHADER_TILER_END,
107 /* kbase_pm_release_cores */
108 [KBASE_PM_FUNC_ID_RELEASE_CORES_START][0] = 0,
109 [KBASE_PM_FUNC_ID_RELEASE_CORES_START][KBASE_PM_CHANGE_STATE_SHADER] =
110 SW_FLOW_PM_CHECKTRANS_PM_RELEASE_CORES_SHADER_START,
111 [KBASE_PM_FUNC_ID_RELEASE_CORES_START][KBASE_PM_CHANGE_STATE_TILER] =
112 SW_FLOW_PM_CHECKTRANS_PM_RELEASE_CORES_TILER_START,
113 [KBASE_PM_FUNC_ID_RELEASE_CORES_START][KBASE_PM_CHANGE_STATE_SHADER |
114 KBASE_PM_CHANGE_STATE_TILER] =
115 SW_FLOW_PM_CHECKTRANS_PM_RELEASE_CORES_SHADER_TILER_START,
117 [KBASE_PM_FUNC_ID_RELEASE_CORES_END][0] = 0,
118 [KBASE_PM_FUNC_ID_RELEASE_CORES_END][KBASE_PM_CHANGE_STATE_SHADER] =
119 SW_FLOW_PM_CHECKTRANS_PM_RELEASE_CORES_SHADER_END,
120 [KBASE_PM_FUNC_ID_RELEASE_CORES_END][KBASE_PM_CHANGE_STATE_TILER] =
121 SW_FLOW_PM_CHECKTRANS_PM_RELEASE_CORES_TILER_END,
122 [KBASE_PM_FUNC_ID_RELEASE_CORES_END][KBASE_PM_CHANGE_STATE_SHADER |
123 KBASE_PM_CHANGE_STATE_TILER] =
124 SW_FLOW_PM_CHECKTRANS_PM_RELEASE_CORES_SHADER_TILER_END
127 static inline void kbase_timeline_pm_cores_func(struct kbase_device *kbdev,
128 enum kbase_pm_func_id func_id,
129 kbase_pm_change_state state)
133 KBASE_DEBUG_ASSERT(func_id >= 0 && func_id < KBASE_PM_FUNC_ID_COUNT);
134 KBASE_DEBUG_ASSERT(state != 0 && (state & KBASE_PM_CHANGE_STATE_MASK) ==
137 trace_code = kbase_pm_change_state_trace_code[func_id][state];
138 KBASE_TIMELINE_PM_CHECKTRANS(kbdev, trace_code);
141 #else /* CONFIG_MALI_TRACE_TIMELINE */
142 static inline void kbase_timeline_pm_cores_func(struct kbase_device *kbdev,
143 enum kbase_pm_func_id func_id, kbase_pm_change_state state)
147 #endif /* CONFIG_MALI_TRACE_TIMELINE */
150 * kbasep_pm_do_poweroff_cores - Process a poweroff request and power down any
151 * requested shader cores
152 * @kbdev: Device pointer
154 static void kbasep_pm_do_poweroff_cores(struct kbase_device *kbdev)
156 u64 prev_shader_state = kbdev->pm.backend.desired_shader_state;
157 u64 prev_tiler_state = kbdev->pm.backend.desired_tiler_state;
159 lockdep_assert_held(&kbdev->pm.power_change_lock);
161 kbdev->pm.backend.desired_shader_state &=
162 ~kbdev->pm.backend.shader_poweroff_pending;
163 kbdev->pm.backend.desired_tiler_state &=
164 ~kbdev->pm.backend.tiler_poweroff_pending;
166 kbdev->pm.backend.shader_poweroff_pending = 0;
167 kbdev->pm.backend.tiler_poweroff_pending = 0;
169 if (prev_shader_state != kbdev->pm.backend.desired_shader_state ||
171 kbdev->pm.backend.desired_tiler_state ||
172 kbdev->pm.backend.ca_in_transition) {
173 bool cores_are_available;
175 KBASE_TIMELINE_PM_CHECKTRANS(kbdev,
176 SW_FLOW_PM_CHECKTRANS_PM_RELEASE_CORES_DEFERRED_START);
177 cores_are_available = kbase_pm_check_transitions_nolock(kbdev);
178 KBASE_TIMELINE_PM_CHECKTRANS(kbdev,
179 SW_FLOW_PM_CHECKTRANS_PM_RELEASE_CORES_DEFERRED_END);
181 /* Don't need 'cores_are_available',
182 * because we don't return anything */
183 CSTD_UNUSED(cores_are_available);
187 static enum hrtimer_restart
188 kbasep_pm_do_gpu_poweroff_callback(struct hrtimer *timer)
190 struct kbase_device *kbdev;
193 kbdev = container_of(timer, struct kbase_device,
194 pm.backend.gpu_poweroff_timer);
196 spin_lock_irqsave(&kbdev->pm.power_change_lock, flags);
198 /* It is safe for this call to do nothing if the work item is already
199 * queued. The worker function will read the must up-to-date state of
200 * kbdev->pm.backend.gpu_poweroff_pending under lock.
202 * If a state change occurs while the worker function is processing,
203 * this call will succeed as a work item can be requeued once it has
204 * started processing.
206 if (kbdev->pm.backend.gpu_poweroff_pending)
207 queue_work(kbdev->pm.backend.gpu_poweroff_wq,
208 &kbdev->pm.backend.gpu_poweroff_work);
210 if (kbdev->pm.backend.shader_poweroff_pending ||
211 kbdev->pm.backend.tiler_poweroff_pending) {
212 kbdev->pm.backend.shader_poweroff_pending_time--;
215 kbdev->pm.backend.shader_poweroff_pending_time
218 if (!kbdev->pm.backend.shader_poweroff_pending_time)
219 kbasep_pm_do_poweroff_cores(kbdev);
222 if (kbdev->pm.backend.poweroff_timer_needed) {
223 spin_unlock_irqrestore(&kbdev->pm.power_change_lock, flags);
225 hrtimer_add_expires(timer, kbdev->pm.gpu_poweroff_time);
227 return HRTIMER_RESTART;
230 kbdev->pm.backend.poweroff_timer_running = false;
231 spin_unlock_irqrestore(&kbdev->pm.power_change_lock, flags);
233 return HRTIMER_NORESTART;
236 static void kbasep_pm_do_gpu_poweroff_wq(struct work_struct *data)
239 struct kbase_device *kbdev;
240 bool do_poweroff = false;
242 kbdev = container_of(data, struct kbase_device,
243 pm.backend.gpu_poweroff_work);
245 mutex_lock(&kbdev->pm.lock);
247 if (kbdev->pm.backend.gpu_poweroff_pending == 0) {
248 mutex_unlock(&kbdev->pm.lock);
252 kbdev->pm.backend.gpu_poweroff_pending--;
254 if (kbdev->pm.backend.gpu_poweroff_pending > 0) {
255 mutex_unlock(&kbdev->pm.lock);
259 KBASE_DEBUG_ASSERT(kbdev->pm.backend.gpu_poweroff_pending == 0);
261 spin_lock_irqsave(&kbdev->pm.power_change_lock, flags);
263 /* Only power off the GPU if a request is still pending */
264 if (!kbdev->pm.backend.pm_current_policy->get_core_active(kbdev))
267 spin_unlock_irqrestore(&kbdev->pm.power_change_lock, flags);
270 kbdev->pm.backend.poweroff_timer_needed = false;
271 hrtimer_cancel(&kbdev->pm.backend.gpu_poweroff_timer);
272 kbdev->pm.backend.poweroff_timer_running = false;
274 /* Power off the GPU */
275 if (!kbase_pm_do_poweroff(kbdev, false)) {
276 /* GPU can not be powered off at present */
277 kbdev->pm.backend.poweroff_timer_needed = true;
278 kbdev->pm.backend.poweroff_timer_running = true;
279 hrtimer_start(&kbdev->pm.backend.gpu_poweroff_timer,
280 kbdev->pm.gpu_poweroff_time,
285 mutex_unlock(&kbdev->pm.lock);
288 int kbase_pm_policy_init(struct kbase_device *kbdev)
290 struct workqueue_struct *wq;
292 wq = alloc_workqueue("kbase_pm_do_poweroff",
293 WQ_HIGHPRI | WQ_UNBOUND, 1);
297 kbdev->pm.backend.gpu_poweroff_wq = wq;
298 INIT_WORK(&kbdev->pm.backend.gpu_poweroff_work,
299 kbasep_pm_do_gpu_poweroff_wq);
300 hrtimer_init(&kbdev->pm.backend.gpu_poweroff_timer,
301 CLOCK_MONOTONIC, HRTIMER_MODE_REL);
302 kbdev->pm.backend.gpu_poweroff_timer.function =
303 kbasep_pm_do_gpu_poweroff_callback;
304 kbdev->pm.backend.pm_current_policy = policy_list[0];
305 kbdev->pm.backend.pm_current_policy->init(kbdev);
306 kbdev->pm.gpu_poweroff_time =
307 HR_TIMER_DELAY_NSEC(DEFAULT_PM_GPU_POWEROFF_TICK_NS);
308 kbdev->pm.poweroff_shader_ticks = DEFAULT_PM_POWEROFF_TICK_SHADER;
309 kbdev->pm.poweroff_gpu_ticks = DEFAULT_PM_POWEROFF_TICK_GPU;
314 void kbase_pm_policy_term(struct kbase_device *kbdev)
316 kbdev->pm.backend.pm_current_policy->term(kbdev);
317 destroy_workqueue(kbdev->pm.backend.gpu_poweroff_wq);
320 void kbase_pm_cancel_deferred_poweroff(struct kbase_device *kbdev)
324 lockdep_assert_held(&kbdev->pm.lock);
326 kbdev->pm.backend.poweroff_timer_needed = false;
327 hrtimer_cancel(&kbdev->pm.backend.gpu_poweroff_timer);
328 spin_lock_irqsave(&kbdev->pm.power_change_lock, flags);
329 kbdev->pm.backend.poweroff_timer_running = false;
331 /* If wq is already running but is held off by pm.lock, make sure it has
333 kbdev->pm.backend.gpu_poweroff_pending = 0;
335 kbdev->pm.backend.shader_poweroff_pending = 0;
336 kbdev->pm.backend.tiler_poweroff_pending = 0;
337 kbdev->pm.backend.shader_poweroff_pending_time = 0;
339 spin_unlock_irqrestore(&kbdev->pm.power_change_lock, flags);
342 void kbase_pm_update_active(struct kbase_device *kbdev)
344 struct kbase_pm_device_data *pm = &kbdev->pm;
345 struct kbase_pm_backend_data *backend = &pm->backend;
349 lockdep_assert_held(&pm->lock);
351 /* pm_current_policy will never be NULL while pm.lock is held */
352 KBASE_DEBUG_ASSERT(backend->pm_current_policy);
354 spin_lock_irqsave(&pm->power_change_lock, flags);
356 active = backend->pm_current_policy->get_core_active(kbdev);
359 if (backend->gpu_poweroff_pending) {
360 /* Cancel any pending power off request */
361 backend->gpu_poweroff_pending = 0;
363 /* If a request was pending then the GPU was still
364 * powered, so no need to continue */
365 if (!kbdev->poweroff_pending) {
366 spin_unlock_irqrestore(&pm->power_change_lock,
372 if (!backend->poweroff_timer_running && !backend->gpu_powered &&
373 (pm->poweroff_gpu_ticks ||
374 pm->poweroff_shader_ticks)) {
375 backend->poweroff_timer_needed = true;
376 backend->poweroff_timer_running = true;
377 hrtimer_start(&backend->gpu_poweroff_timer,
378 pm->gpu_poweroff_time,
382 spin_unlock_irqrestore(&pm->power_change_lock, flags);
384 /* Power on the GPU and any cores requested by the policy */
385 kbase_pm_do_poweron(kbdev, false);
387 /* It is an error for the power policy to power off the GPU
388 * when there are contexts active */
389 KBASE_DEBUG_ASSERT(pm->active_count == 0);
391 if (backend->shader_poweroff_pending ||
392 backend->tiler_poweroff_pending) {
393 backend->shader_poweroff_pending = 0;
394 backend->tiler_poweroff_pending = 0;
395 backend->shader_poweroff_pending_time = 0;
398 /* Request power off */
399 if (pm->backend.gpu_powered) {
400 if (pm->poweroff_gpu_ticks) {
401 backend->gpu_poweroff_pending =
402 pm->poweroff_gpu_ticks;
403 backend->poweroff_timer_needed = true;
404 if (!backend->poweroff_timer_running) {
405 /* Start timer if not running (eg if
406 * power policy has been changed from
407 * always_on to something else). This
408 * will ensure the GPU is actually
410 backend->poweroff_timer_running
413 &backend->gpu_poweroff_timer,
414 pm->gpu_poweroff_time,
417 spin_unlock_irqrestore(&pm->power_change_lock,
420 spin_unlock_irqrestore(&pm->power_change_lock,
423 /* Power off the GPU immediately */
424 if (!kbase_pm_do_poweroff(kbdev, false)) {
425 /* GPU can not be powered off at present
428 &pm->power_change_lock,
430 backend->poweroff_timer_needed = true;
431 if (!backend->poweroff_timer_running) {
432 backend->poweroff_timer_running
435 &backend->gpu_poweroff_timer,
436 pm->gpu_poweroff_time,
439 spin_unlock_irqrestore(
440 &pm->power_change_lock,
445 spin_unlock_irqrestore(&pm->power_change_lock, flags);
450 void kbase_pm_update_cores_state_nolock(struct kbase_device *kbdev)
453 u64 desired_tiler_bitmap;
454 bool cores_are_available;
455 bool do_poweroff = false;
457 lockdep_assert_held(&kbdev->pm.power_change_lock);
459 if (kbdev->pm.backend.pm_current_policy == NULL)
463 kbdev->pm.backend.pm_current_policy->get_core_mask(kbdev);
464 desired_bitmap &= kbase_pm_ca_get_core_mask(kbdev);
466 if (kbdev->tiler_needed_cnt > 0 || kbdev->tiler_inuse_cnt > 0)
467 desired_tiler_bitmap = 1;
469 desired_tiler_bitmap = 0;
471 if (!kbase_hw_has_feature(kbdev, BASE_HW_FEATURE_XAFFINITY)) {
472 /* Unless XAFFINITY is supported, enable core 0 if tiler
473 * required, regardless of core availability */
474 if (kbdev->tiler_needed_cnt > 0 || kbdev->tiler_inuse_cnt > 0)
478 if (kbdev->pm.backend.desired_shader_state != desired_bitmap)
479 KBASE_TRACE_ADD(kbdev, PM_CORES_CHANGE_DESIRED, NULL, NULL, 0u,
480 (u32)desired_bitmap);
481 /* Are any cores being powered on? */
482 if (~kbdev->pm.backend.desired_shader_state & desired_bitmap ||
483 ~kbdev->pm.backend.desired_tiler_state & desired_tiler_bitmap ||
484 kbdev->pm.backend.ca_in_transition) {
485 /* Check if we are powering off any cores before updating shader
487 if (kbdev->pm.backend.desired_shader_state & ~desired_bitmap ||
488 kbdev->pm.backend.desired_tiler_state &
489 ~desired_tiler_bitmap) {
490 /* Start timer to power off cores */
491 kbdev->pm.backend.shader_poweroff_pending |=
492 (kbdev->pm.backend.desired_shader_state &
494 kbdev->pm.backend.tiler_poweroff_pending |=
495 (kbdev->pm.backend.desired_tiler_state &
496 ~desired_tiler_bitmap);
498 if (kbdev->pm.poweroff_shader_ticks)
499 kbdev->pm.backend.shader_poweroff_pending_time =
500 kbdev->pm.poweroff_shader_ticks;
505 kbdev->pm.backend.desired_shader_state = desired_bitmap;
506 kbdev->pm.backend.desired_tiler_state = desired_tiler_bitmap;
508 /* If any cores are being powered on, transition immediately */
509 cores_are_available = kbase_pm_check_transitions_nolock(kbdev);
510 } else if (kbdev->pm.backend.desired_shader_state & ~desired_bitmap ||
511 kbdev->pm.backend.desired_tiler_state &
512 ~desired_tiler_bitmap) {
513 /* Start timer to power off cores */
514 kbdev->pm.backend.shader_poweroff_pending |=
515 (kbdev->pm.backend.desired_shader_state &
517 kbdev->pm.backend.tiler_poweroff_pending |=
518 (kbdev->pm.backend.desired_tiler_state &
519 ~desired_tiler_bitmap);
520 if (kbdev->pm.poweroff_shader_ticks)
521 kbdev->pm.backend.shader_poweroff_pending_time =
522 kbdev->pm.poweroff_shader_ticks;
524 kbasep_pm_do_poweroff_cores(kbdev);
525 } else if (kbdev->pm.active_count == 0 && desired_bitmap != 0 &&
526 desired_tiler_bitmap != 0 &&
527 kbdev->pm.backend.poweroff_timer_needed) {
528 /* If power policy is keeping cores on despite there being no
529 * active contexts then disable poweroff timer as it isn't
531 * Only reset poweroff_timer_needed if we're not in the middle
532 * of the power off callback */
533 kbdev->pm.backend.poweroff_timer_needed = false;
536 /* Ensure timer does not power off wanted cores and make sure to power
537 * off unwanted cores */
538 if (kbdev->pm.backend.shader_poweroff_pending ||
539 kbdev->pm.backend.tiler_poweroff_pending) {
540 kbdev->pm.backend.shader_poweroff_pending &=
541 ~(kbdev->pm.backend.desired_shader_state &
543 kbdev->pm.backend.tiler_poweroff_pending &=
544 ~(kbdev->pm.backend.desired_tiler_state &
545 desired_tiler_bitmap);
547 if (!kbdev->pm.backend.shader_poweroff_pending &&
548 !kbdev->pm.backend.tiler_poweroff_pending)
549 kbdev->pm.backend.shader_poweroff_pending_time = 0;
552 /* Shader poweroff is deferred to the end of the function, to eliminate
553 * issues caused by the core availability policy recursing into this
556 kbasep_pm_do_poweroff_cores(kbdev);
558 /* Don't need 'cores_are_available', because we don't return anything */
559 CSTD_UNUSED(cores_are_available);
562 void kbase_pm_update_cores_state(struct kbase_device *kbdev)
566 spin_lock_irqsave(&kbdev->pm.power_change_lock, flags);
568 kbase_pm_update_cores_state_nolock(kbdev);
570 spin_unlock_irqrestore(&kbdev->pm.power_change_lock, flags);
573 int kbase_pm_list_policies(const struct kbase_pm_policy * const **list)
583 KBASE_EXPORT_TEST_API(kbase_pm_list_policies);
585 const struct kbase_pm_policy *kbase_pm_get_policy(struct kbase_device *kbdev)
587 KBASE_DEBUG_ASSERT(kbdev != NULL);
589 return kbdev->pm.backend.pm_current_policy;
592 KBASE_EXPORT_TEST_API(kbase_pm_get_policy);
594 void kbase_pm_set_policy(struct kbase_device *kbdev,
595 const struct kbase_pm_policy *new_policy)
597 struct kbasep_js_device_data *js_devdata = &kbdev->js_data;
598 const struct kbase_pm_policy *old_policy;
601 KBASE_DEBUG_ASSERT(kbdev != NULL);
602 KBASE_DEBUG_ASSERT(new_policy != NULL);
604 KBASE_TRACE_ADD(kbdev, PM_SET_POLICY, NULL, NULL, 0u, new_policy->id);
606 /* During a policy change we pretend the GPU is active */
607 /* A suspend won't happen here, because we're in a syscall from a
608 * userspace thread */
609 kbase_pm_context_active(kbdev);
611 mutex_lock(&js_devdata->runpool_mutex);
612 mutex_lock(&kbdev->pm.lock);
614 /* Remove the policy to prevent IRQ handlers from working on it */
615 spin_lock_irqsave(&kbdev->pm.power_change_lock, flags);
616 old_policy = kbdev->pm.backend.pm_current_policy;
617 kbdev->pm.backend.pm_current_policy = NULL;
618 spin_unlock_irqrestore(&kbdev->pm.power_change_lock, flags);
620 KBASE_TRACE_ADD(kbdev, PM_CURRENT_POLICY_TERM, NULL, NULL, 0u,
622 if (old_policy->term)
623 old_policy->term(kbdev);
625 KBASE_TRACE_ADD(kbdev, PM_CURRENT_POLICY_INIT, NULL, NULL, 0u,
627 if (new_policy->init)
628 new_policy->init(kbdev);
630 spin_lock_irqsave(&kbdev->pm.power_change_lock, flags);
631 kbdev->pm.backend.pm_current_policy = new_policy;
632 spin_unlock_irqrestore(&kbdev->pm.power_change_lock, flags);
634 /* If any core power state changes were previously attempted, but
635 * couldn't be made because the policy was changing (current_policy was
636 * NULL), then re-try them here. */
637 kbase_pm_update_active(kbdev);
638 kbase_pm_update_cores_state(kbdev);
640 mutex_unlock(&kbdev->pm.lock);
641 mutex_unlock(&js_devdata->runpool_mutex);
643 /* Now the policy change is finished, we release our fake context active
645 kbase_pm_context_idle(kbdev);
648 KBASE_EXPORT_TEST_API(kbase_pm_set_policy);
650 /* Check whether a state change has finished, and trace it as completed */
652 kbase_pm_trace_check_and_finish_state_change(struct kbase_device *kbdev)
654 if ((kbdev->shader_available_bitmap &
655 kbdev->pm.backend.desired_shader_state)
656 == kbdev->pm.backend.desired_shader_state &&
657 (kbdev->tiler_available_bitmap &
658 kbdev->pm.backend.desired_tiler_state)
659 == kbdev->pm.backend.desired_tiler_state)
660 kbase_timeline_pm_check_handle_event(kbdev,
661 KBASE_TIMELINE_PM_EVENT_GPU_STATE_CHANGED);
664 void kbase_pm_request_cores(struct kbase_device *kbdev,
665 bool tiler_required, u64 shader_cores)
670 kbase_pm_change_state change_gpu_state = 0u;
672 KBASE_DEBUG_ASSERT(kbdev != NULL);
674 spin_lock_irqsave(&kbdev->pm.power_change_lock, flags);
676 cores = shader_cores;
678 int bitnum = fls64(cores) - 1;
679 u64 bit = 1ULL << bitnum;
681 /* It should be almost impossible for this to overflow. It would
682 * require 2^32 atoms to request a particular core, which would
683 * require 2^24 contexts to submit. This would require an amount
684 * of memory that is impossible on a 32-bit system and extremely
685 * unlikely on a 64-bit system. */
686 int cnt = ++kbdev->shader_needed_cnt[bitnum];
689 kbdev->shader_needed_bitmap |= bit;
690 change_gpu_state |= KBASE_PM_CHANGE_STATE_SHADER;
696 if (tiler_required) {
697 int cnt = ++kbdev->tiler_needed_cnt;
700 change_gpu_state |= KBASE_PM_CHANGE_STATE_TILER;
702 KBASE_DEBUG_ASSERT(kbdev->tiler_needed_cnt != 0);
705 if (change_gpu_state) {
706 KBASE_TRACE_ADD(kbdev, PM_REQUEST_CHANGE_SHADER_NEEDED, NULL,
707 NULL, 0u, (u32) kbdev->shader_needed_bitmap);
709 kbase_timeline_pm_cores_func(kbdev,
710 KBASE_PM_FUNC_ID_REQUEST_CORES_START,
712 kbase_pm_update_cores_state_nolock(kbdev);
713 kbase_timeline_pm_cores_func(kbdev,
714 KBASE_PM_FUNC_ID_REQUEST_CORES_END,
718 spin_unlock_irqrestore(&kbdev->pm.power_change_lock, flags);
721 KBASE_EXPORT_TEST_API(kbase_pm_request_cores);
723 void kbase_pm_unrequest_cores(struct kbase_device *kbdev,
724 bool tiler_required, u64 shader_cores)
728 kbase_pm_change_state change_gpu_state = 0u;
730 KBASE_DEBUG_ASSERT(kbdev != NULL);
732 spin_lock_irqsave(&kbdev->pm.power_change_lock, flags);
734 while (shader_cores) {
735 int bitnum = fls64(shader_cores) - 1;
736 u64 bit = 1ULL << bitnum;
739 KBASE_DEBUG_ASSERT(kbdev->shader_needed_cnt[bitnum] > 0);
741 cnt = --kbdev->shader_needed_cnt[bitnum];
744 kbdev->shader_needed_bitmap &= ~bit;
746 change_gpu_state |= KBASE_PM_CHANGE_STATE_SHADER;
749 shader_cores &= ~bit;
752 if (tiler_required) {
755 KBASE_DEBUG_ASSERT(kbdev->tiler_needed_cnt > 0);
757 cnt = --kbdev->tiler_needed_cnt;
760 change_gpu_state |= KBASE_PM_CHANGE_STATE_TILER;
763 if (change_gpu_state) {
764 KBASE_TRACE_ADD(kbdev, PM_UNREQUEST_CHANGE_SHADER_NEEDED, NULL,
765 NULL, 0u, (u32) kbdev->shader_needed_bitmap);
767 kbase_pm_update_cores_state_nolock(kbdev);
769 /* Trace that any state change effectively completes immediately
770 * - no-one will wait on the state change */
771 kbase_pm_trace_check_and_finish_state_change(kbdev);
774 spin_unlock_irqrestore(&kbdev->pm.power_change_lock, flags);
777 KBASE_EXPORT_TEST_API(kbase_pm_unrequest_cores);
779 enum kbase_pm_cores_ready
780 kbase_pm_register_inuse_cores(struct kbase_device *kbdev,
781 bool tiler_required, u64 shader_cores)
784 u64 prev_shader_needed; /* Just for tracing */
785 u64 prev_shader_inuse; /* Just for tracing */
787 spin_lock_irqsave(&kbdev->pm.power_change_lock, flags);
789 prev_shader_needed = kbdev->shader_needed_bitmap;
790 prev_shader_inuse = kbdev->shader_inuse_bitmap;
792 /* If desired_shader_state does not contain the requested cores, then
793 * power management is not attempting to powering those cores (most
794 * likely due to core availability policy) and a new job affinity must
796 if ((kbdev->pm.backend.desired_shader_state & shader_cores) !=
798 spin_unlock_irqrestore(&kbdev->pm.power_change_lock, flags);
800 return KBASE_NEW_AFFINITY;
803 if ((kbdev->shader_available_bitmap & shader_cores) != shader_cores ||
804 (tiler_required && !kbdev->tiler_available_bitmap)) {
805 /* Trace ongoing core transition */
806 kbase_timeline_pm_l2_transition_start(kbdev);
807 spin_unlock_irqrestore(&kbdev->pm.power_change_lock, flags);
808 return KBASE_CORES_NOT_READY;
811 /* If we started to trace a state change, then trace it has being
812 * finished by now, at the very latest */
813 kbase_pm_trace_check_and_finish_state_change(kbdev);
814 /* Trace core transition done */
815 kbase_timeline_pm_l2_transition_done(kbdev);
817 while (shader_cores) {
818 int bitnum = fls64(shader_cores) - 1;
819 u64 bit = 1ULL << bitnum;
822 KBASE_DEBUG_ASSERT(kbdev->shader_needed_cnt[bitnum] > 0);
824 cnt = --kbdev->shader_needed_cnt[bitnum];
827 kbdev->shader_needed_bitmap &= ~bit;
829 /* shader_inuse_cnt should not overflow because there can only
830 * be a very limited number of jobs on the h/w at one time */
832 kbdev->shader_inuse_cnt[bitnum]++;
833 kbdev->shader_inuse_bitmap |= bit;
835 shader_cores &= ~bit;
838 if (tiler_required) {
839 KBASE_DEBUG_ASSERT(kbdev->tiler_needed_cnt > 0);
841 --kbdev->tiler_needed_cnt;
843 kbdev->tiler_inuse_cnt++;
845 KBASE_DEBUG_ASSERT(kbdev->tiler_inuse_cnt != 0);
848 if (prev_shader_needed != kbdev->shader_needed_bitmap)
849 KBASE_TRACE_ADD(kbdev, PM_REGISTER_CHANGE_SHADER_NEEDED, NULL,
850 NULL, 0u, (u32) kbdev->shader_needed_bitmap);
852 if (prev_shader_inuse != kbdev->shader_inuse_bitmap)
853 KBASE_TRACE_ADD(kbdev, PM_REGISTER_CHANGE_SHADER_INUSE, NULL,
854 NULL, 0u, (u32) kbdev->shader_inuse_bitmap);
856 spin_unlock_irqrestore(&kbdev->pm.power_change_lock, flags);
858 return KBASE_CORES_READY;
861 KBASE_EXPORT_TEST_API(kbase_pm_register_inuse_cores);
863 void kbase_pm_release_cores(struct kbase_device *kbdev,
864 bool tiler_required, u64 shader_cores)
867 kbase_pm_change_state change_gpu_state = 0u;
869 KBASE_DEBUG_ASSERT(kbdev != NULL);
871 spin_lock_irqsave(&kbdev->pm.power_change_lock, flags);
873 while (shader_cores) {
874 int bitnum = fls64(shader_cores) - 1;
875 u64 bit = 1ULL << bitnum;
878 KBASE_DEBUG_ASSERT(kbdev->shader_inuse_cnt[bitnum] > 0);
880 cnt = --kbdev->shader_inuse_cnt[bitnum];
883 kbdev->shader_inuse_bitmap &= ~bit;
884 change_gpu_state |= KBASE_PM_CHANGE_STATE_SHADER;
887 shader_cores &= ~bit;
890 if (tiler_required) {
893 KBASE_DEBUG_ASSERT(kbdev->tiler_inuse_cnt > 0);
895 cnt = --kbdev->tiler_inuse_cnt;
898 change_gpu_state |= KBASE_PM_CHANGE_STATE_TILER;
901 if (change_gpu_state) {
902 KBASE_TRACE_ADD(kbdev, PM_RELEASE_CHANGE_SHADER_INUSE, NULL,
903 NULL, 0u, (u32) kbdev->shader_inuse_bitmap);
905 kbase_timeline_pm_cores_func(kbdev,
906 KBASE_PM_FUNC_ID_RELEASE_CORES_START,
908 kbase_pm_update_cores_state_nolock(kbdev);
909 kbase_timeline_pm_cores_func(kbdev,
910 KBASE_PM_FUNC_ID_RELEASE_CORES_END,
913 /* Trace that any state change completed immediately */
914 kbase_pm_trace_check_and_finish_state_change(kbdev);
917 spin_unlock_irqrestore(&kbdev->pm.power_change_lock, flags);
920 KBASE_EXPORT_TEST_API(kbase_pm_release_cores);
922 void kbase_pm_request_cores_sync(struct kbase_device *kbdev,
926 kbase_pm_request_cores(kbdev, tiler_required, shader_cores);
928 kbase_pm_check_transitions_sync(kbdev);
931 KBASE_EXPORT_TEST_API(kbase_pm_request_cores_sync);
933 void kbase_pm_request_l2_caches(struct kbase_device *kbdev)
936 u32 prior_l2_users_count;
938 spin_lock_irqsave(&kbdev->pm.power_change_lock, flags);
940 prior_l2_users_count = kbdev->l2_users_count++;
942 KBASE_DEBUG_ASSERT(kbdev->l2_users_count != 0);
944 /* if the GPU is reset while the l2 is on, l2 will be off but
945 * prior_l2_users_count will be > 0. l2_available_bitmap will have been
946 * set to 0 though by kbase_pm_init_hw */
947 if (!prior_l2_users_count || !kbdev->l2_available_bitmap)
948 kbase_pm_check_transitions_nolock(kbdev);
950 spin_unlock_irqrestore(&kbdev->pm.power_change_lock, flags);
951 wait_event(kbdev->pm.backend.l2_powered_wait,
952 kbdev->pm.backend.l2_powered == 1);
954 /* Trace that any state change completed immediately */
955 kbase_pm_trace_check_and_finish_state_change(kbdev);
958 KBASE_EXPORT_TEST_API(kbase_pm_request_l2_caches);
960 void kbase_pm_request_l2_caches_l2_is_on(struct kbase_device *kbdev)
964 spin_lock_irqsave(&kbdev->pm.power_change_lock, flags);
966 kbdev->l2_users_count++;
968 spin_unlock_irqrestore(&kbdev->pm.power_change_lock, flags);
971 KBASE_EXPORT_TEST_API(kbase_pm_request_l2_caches_l2_is_on);
973 void kbase_pm_release_l2_caches(struct kbase_device *kbdev)
977 spin_lock_irqsave(&kbdev->pm.power_change_lock, flags);
979 KBASE_DEBUG_ASSERT(kbdev->l2_users_count > 0);
981 --kbdev->l2_users_count;
983 if (!kbdev->l2_users_count) {
984 kbase_pm_check_transitions_nolock(kbdev);
985 /* Trace that any state change completed immediately */
986 kbase_pm_trace_check_and_finish_state_change(kbdev);
989 spin_unlock_irqrestore(&kbdev->pm.power_change_lock, flags);
992 KBASE_EXPORT_TEST_API(kbase_pm_release_l2_caches);