Lines Matching refs:policy

83 static unsigned int __cpufreq_get(struct cpufreq_policy *policy);
84 static int cpufreq_init_governor(struct cpufreq_policy *policy);
85 static void cpufreq_exit_governor(struct cpufreq_policy *policy);
86 static void cpufreq_governor_limits(struct cpufreq_policy *policy);
87 static int cpufreq_set_policy(struct cpufreq_policy *policy,
124 struct kobject *get_governor_parent_kobj(struct cpufreq_policy *policy) in get_governor_parent_kobj() argument
127 return &policy->kobj; in get_governor_parent_kobj()
178 void cpufreq_generic_init(struct cpufreq_policy *policy, in cpufreq_generic_init() argument
182 policy->freq_table = table; in cpufreq_generic_init()
183 policy->cpuinfo.transition_latency = transition_latency; in cpufreq_generic_init()
189 cpumask_setall(policy->cpus); in cpufreq_generic_init()
195 struct cpufreq_policy *policy = per_cpu(cpufreq_cpu_data, cpu); in cpufreq_cpu_get_raw() local
197 return policy && cpumask_test_cpu(cpu, policy->cpus) ? policy : NULL; in cpufreq_cpu_get_raw()
209 struct cpufreq_policy *policy = cpufreq_cpu_get_raw(cpu); in cpufreq_generic_get() local
211 if (!policy || IS_ERR(policy->clk)) { in cpufreq_generic_get()
213 __func__, policy ? "clk" : "policy", cpu); in cpufreq_generic_get()
217 return clk_get_rate(policy->clk) / 1000; in cpufreq_generic_get()
234 struct cpufreq_policy *policy = NULL; in cpufreq_cpu_get() local
245 policy = cpufreq_cpu_get_raw(cpu); in cpufreq_cpu_get()
246 if (policy) in cpufreq_cpu_get()
247 kobject_get(&policy->kobj); in cpufreq_cpu_get()
252 return policy; in cpufreq_cpu_get()
260 void cpufreq_cpu_put(struct cpufreq_policy *policy) in cpufreq_cpu_put() argument
262 kobject_put(&policy->kobj); in cpufreq_cpu_put()
314 static void cpufreq_notify_transition(struct cpufreq_policy *policy, in cpufreq_notify_transition() argument
325 freqs->policy = policy; in cpufreq_notify_transition()
337 if (policy->cur && policy->cur != freqs->old) { in cpufreq_notify_transition()
339 freqs->old, policy->cur); in cpufreq_notify_transition()
340 freqs->old = policy->cur; in cpufreq_notify_transition()
352 cpumask_pr_args(policy->cpus)); in cpufreq_notify_transition()
354 for_each_cpu(cpu, policy->cpus) in cpufreq_notify_transition()
360 cpufreq_stats_record_transition(policy, freqs->new); in cpufreq_notify_transition()
361 policy->cur = freqs->new; in cpufreq_notify_transition()
366 static void cpufreq_notify_post_transition(struct cpufreq_policy *policy, in cpufreq_notify_post_transition() argument
369 cpufreq_notify_transition(policy, freqs, CPUFREQ_POSTCHANGE); in cpufreq_notify_post_transition()
374 cpufreq_notify_transition(policy, freqs, CPUFREQ_PRECHANGE); in cpufreq_notify_post_transition()
375 cpufreq_notify_transition(policy, freqs, CPUFREQ_POSTCHANGE); in cpufreq_notify_post_transition()
378 void cpufreq_freq_transition_begin(struct cpufreq_policy *policy, in cpufreq_freq_transition_begin() argument
391 && current == policy->transition_task); in cpufreq_freq_transition_begin()
394 wait_event(policy->transition_wait, !policy->transition_ongoing); in cpufreq_freq_transition_begin()
396 spin_lock(&policy->transition_lock); in cpufreq_freq_transition_begin()
398 if (unlikely(policy->transition_ongoing)) { in cpufreq_freq_transition_begin()
399 spin_unlock(&policy->transition_lock); in cpufreq_freq_transition_begin()
403 policy->transition_ongoing = true; in cpufreq_freq_transition_begin()
404 policy->transition_task = current; in cpufreq_freq_transition_begin()
406 spin_unlock(&policy->transition_lock); in cpufreq_freq_transition_begin()
408 cpufreq_notify_transition(policy, freqs, CPUFREQ_PRECHANGE); in cpufreq_freq_transition_begin()
412 void cpufreq_freq_transition_end(struct cpufreq_policy *policy, in cpufreq_freq_transition_end() argument
415 if (WARN_ON(!policy->transition_ongoing)) in cpufreq_freq_transition_end()
418 cpufreq_notify_post_transition(policy, freqs, transition_failed); in cpufreq_freq_transition_end()
420 arch_set_freq_scale(policy->related_cpus, in cpufreq_freq_transition_end()
421 policy->cur, in cpufreq_freq_transition_end()
422 arch_scale_freq_ref(policy->cpu)); in cpufreq_freq_transition_end()
424 spin_lock(&policy->transition_lock); in cpufreq_freq_transition_end()
425 policy->transition_ongoing = false; in cpufreq_freq_transition_end()
426 policy->transition_task = NULL; in cpufreq_freq_transition_end()
427 spin_unlock(&policy->transition_lock); in cpufreq_freq_transition_end()
429 wake_up(&policy->transition_wait); in cpufreq_freq_transition_end()
465 void cpufreq_enable_fast_switch(struct cpufreq_policy *policy) in cpufreq_enable_fast_switch() argument
467 lockdep_assert_held(&policy->rwsem); in cpufreq_enable_fast_switch()
469 if (!policy->fast_switch_possible) in cpufreq_enable_fast_switch()
475 policy->fast_switch_enabled = true; in cpufreq_enable_fast_switch()
478 policy->cpu); in cpufreq_enable_fast_switch()
489 void cpufreq_disable_fast_switch(struct cpufreq_policy *policy) in cpufreq_disable_fast_switch() argument
492 if (policy->fast_switch_enabled) { in cpufreq_disable_fast_switch()
493 policy->fast_switch_enabled = false; in cpufreq_disable_fast_switch()
501 static unsigned int __resolve_freq(struct cpufreq_policy *policy, in __resolve_freq() argument
510 if (!policy->freq_table) in __resolve_freq()
513 idx = cpufreq_frequency_table_target(policy, target_freq, min, max, relation); in __resolve_freq()
514 policy->cached_resolved_idx = idx; in __resolve_freq()
515 policy->cached_target_freq = target_freq; in __resolve_freq()
516 return policy->freq_table[idx].frequency; in __resolve_freq()
530 unsigned int cpufreq_driver_resolve_freq(struct cpufreq_policy *policy, in cpufreq_driver_resolve_freq() argument
533 unsigned int min = READ_ONCE(policy->min); in cpufreq_driver_resolve_freq()
534 unsigned int max = READ_ONCE(policy->max); in cpufreq_driver_resolve_freq()
547 return __resolve_freq(policy, target_freq, min, max, CPUFREQ_RELATION_LE); in cpufreq_driver_resolve_freq()
551 unsigned int cpufreq_policy_transition_delay_us(struct cpufreq_policy *policy) in cpufreq_policy_transition_delay_us() argument
555 if (policy->transition_delay_us) in cpufreq_policy_transition_delay_us()
556 return policy->transition_delay_us; in cpufreq_policy_transition_delay_us()
558 latency = policy->cpuinfo.transition_latency / NSEC_PER_USEC; in cpufreq_policy_transition_delay_us()
597 static ssize_t show_local_boost(struct cpufreq_policy *policy, char *buf) in show_local_boost() argument
599 return sysfs_emit(buf, "%d\n", policy->boost_enabled); in show_local_boost()
602 static int policy_set_boost(struct cpufreq_policy *policy, bool enable) in policy_set_boost() argument
606 if (policy->boost_enabled == enable) in policy_set_boost()
609 policy->boost_enabled = enable; in policy_set_boost()
611 ret = cpufreq_driver->set_boost(policy, enable); in policy_set_boost()
613 policy->boost_enabled = !policy->boost_enabled; in policy_set_boost()
617 ret = freq_qos_update_request(&policy->boost_freq_req, policy->cpuinfo.max_freq); in policy_set_boost()
619 policy->boost_enabled = !policy->boost_enabled; in policy_set_boost()
620 cpufreq_driver->set_boost(policy, policy->boost_enabled); in policy_set_boost()
627 static ssize_t store_local_boost(struct cpufreq_policy *policy, in store_local_boost() argument
639 if (!policy->boost_supported) in store_local_boost()
642 ret = policy_set_boost(policy, enable); in store_local_boost()
719 (struct cpufreq_policy *policy, char *buf) \
721 return sysfs_emit(buf, "%u\n", policy->object); \
735 static inline bool cpufreq_avg_freq_supported(struct cpufreq_policy *policy) in cpufreq_avg_freq_supported() argument
737 return arch_freq_get_on_cpu(policy->cpu) != -EOPNOTSUPP; in cpufreq_avg_freq_supported()
740 static ssize_t show_scaling_cur_freq(struct cpufreq_policy *policy, char *buf) in show_scaling_cur_freq() argument
746 ? arch_freq_get_on_cpu(policy->cpu) in show_scaling_cur_freq()
752 ret = sysfs_emit(buf, "%u\n", cpufreq_driver->get(policy->cpu)); in show_scaling_cur_freq()
754 ret = sysfs_emit(buf, "%u\n", policy->cur); in show_scaling_cur_freq()
763 (struct cpufreq_policy *policy, const char *buf, size_t count) \
772 ret = freq_qos_update_request(&policy->object##_freq_req, val); \
782 static ssize_t show_cpuinfo_cur_freq(struct cpufreq_policy *policy, in show_cpuinfo_cur_freq() argument
785 unsigned int cur_freq = __cpufreq_get(policy); in show_cpuinfo_cur_freq()
796 static ssize_t show_cpuinfo_avg_freq(struct cpufreq_policy *policy, in show_cpuinfo_avg_freq() argument
799 int avg_freq = arch_freq_get_on_cpu(policy->cpu); in show_cpuinfo_avg_freq()
809 static ssize_t show_scaling_governor(struct cpufreq_policy *policy, char *buf) in show_scaling_governor() argument
811 if (policy->policy == CPUFREQ_POLICY_POWERSAVE) in show_scaling_governor()
813 else if (policy->policy == CPUFREQ_POLICY_PERFORMANCE) in show_scaling_governor()
815 else if (policy->governor) in show_scaling_governor()
816 return sysfs_emit(buf, "%s\n", policy->governor->name); in show_scaling_governor()
823 static ssize_t store_scaling_governor(struct cpufreq_policy *policy, in store_scaling_governor() argument
840 ret = cpufreq_set_policy(policy, NULL, new_pol); in store_scaling_governor()
848 ret = cpufreq_set_policy(policy, new_gov, in store_scaling_governor()
860 static ssize_t show_scaling_driver(struct cpufreq_policy *policy, char *buf) in show_scaling_driver() argument
868 static ssize_t show_scaling_available_governors(struct cpufreq_policy *policy, in show_scaling_available_governors() argument
915 static ssize_t show_related_cpus(struct cpufreq_policy *policy, char *buf) in show_related_cpus() argument
917 return cpufreq_show_cpus(policy->related_cpus, buf); in show_related_cpus()
923 static ssize_t show_affected_cpus(struct cpufreq_policy *policy, char *buf) in show_affected_cpus() argument
925 return cpufreq_show_cpus(policy->cpus, buf); in show_affected_cpus()
928 static ssize_t store_scaling_setspeed(struct cpufreq_policy *policy, in store_scaling_setspeed() argument
934 if (!policy->governor || !policy->governor->store_setspeed) in store_scaling_setspeed()
941 policy->governor->store_setspeed(policy, freq); in store_scaling_setspeed()
946 static ssize_t show_scaling_setspeed(struct cpufreq_policy *policy, char *buf) in show_scaling_setspeed() argument
948 if (!policy->governor || !policy->governor->show_setspeed) in show_scaling_setspeed()
951 return policy->governor->show_setspeed(policy, buf); in show_scaling_setspeed()
957 static ssize_t show_bios_limit(struct cpufreq_policy *policy, char *buf) in show_bios_limit() argument
961 ret = cpufreq_driver->bios_limit(policy->cpu, &limit); in show_bios_limit()
964 return sysfs_emit(buf, "%u\n", policy->cpuinfo.max_freq); in show_bios_limit()
1005 struct cpufreq_policy *policy = to_policy(kobj); in show() local
1011 guard(cpufreq_policy_read)(policy); in show()
1013 if (likely(!policy_is_inactive(policy))) in show()
1014 return fattr->show(policy, buf); in show()
1022 struct cpufreq_policy *policy = to_policy(kobj); in store() local
1028 guard(cpufreq_policy_write)(policy); in store()
1030 if (likely(!policy_is_inactive(policy))) in store()
1031 return fattr->store(policy, buf, count); in store()
1038 struct cpufreq_policy *policy = to_policy(kobj); in cpufreq_sysfs_release() local
1040 complete(&policy->kobj_unregister); in cpufreq_sysfs_release()
1054 static void add_cpu_dev_symlink(struct cpufreq_policy *policy, unsigned int cpu, in add_cpu_dev_symlink() argument
1060 if (cpumask_test_and_set_cpu(cpu, policy->real_cpus)) in add_cpu_dev_symlink()
1064 if (sysfs_create_link(&dev->kobj, &policy->kobj, "cpufreq")) in add_cpu_dev_symlink()
1068 static void remove_cpu_dev_symlink(struct cpufreq_policy *policy, int cpu, in remove_cpu_dev_symlink() argument
1073 cpumask_clear_cpu(cpu, policy->real_cpus); in remove_cpu_dev_symlink()
1076 static int cpufreq_add_dev_interface(struct cpufreq_policy *policy) in cpufreq_add_dev_interface() argument
1082 if (policy->freq_table) { in cpufreq_add_dev_interface()
1083 ret = sysfs_create_file(&policy->kobj, in cpufreq_add_dev_interface()
1089 ret = sysfs_create_file(&policy->kobj, in cpufreq_add_dev_interface()
1099 ret = sysfs_create_file(&policy->kobj, &((*drv_attr)->attr)); in cpufreq_add_dev_interface()
1105 ret = sysfs_create_file(&policy->kobj, &cpuinfo_cur_freq.attr); in cpufreq_add_dev_interface()
1110 if (cpufreq_avg_freq_supported(policy)) { in cpufreq_add_dev_interface()
1111 ret = sysfs_create_file(&policy->kobj, &cpuinfo_avg_freq.attr); in cpufreq_add_dev_interface()
1117 ret = sysfs_create_file(&policy->kobj, &bios_limit.attr); in cpufreq_add_dev_interface()
1123 ret = sysfs_create_file(&policy->kobj, &local_boost.attr); in cpufreq_add_dev_interface()
1131 static int cpufreq_init_policy(struct cpufreq_policy *policy) in cpufreq_init_policy() argument
1139 if (policy->last_governor[0] != '\0') in cpufreq_init_policy()
1140 gov = get_governor(policy->last_governor); in cpufreq_init_policy()
1143 gov->name, policy->cpu); in cpufreq_init_policy()
1156 if (policy->last_policy) { in cpufreq_init_policy()
1157 pol = policy->last_policy; in cpufreq_init_policy()
1166 pol = policy->policy; in cpufreq_init_policy()
1173 ret = cpufreq_set_policy(policy, gov, pol); in cpufreq_init_policy()
1180 static int cpufreq_add_policy_cpu(struct cpufreq_policy *policy, unsigned int cpu) in cpufreq_add_policy_cpu() argument
1185 if (cpumask_test_cpu(cpu, policy->cpus)) in cpufreq_add_policy_cpu()
1188 guard(cpufreq_policy_write)(policy); in cpufreq_add_policy_cpu()
1191 cpufreq_stop_governor(policy); in cpufreq_add_policy_cpu()
1193 cpumask_set_cpu(cpu, policy->cpus); in cpufreq_add_policy_cpu()
1196 ret = cpufreq_start_governor(policy); in cpufreq_add_policy_cpu()
1204 void refresh_frequency_limits(struct cpufreq_policy *policy) in refresh_frequency_limits() argument
1206 if (!policy_is_inactive(policy)) { in refresh_frequency_limits()
1207 pr_debug("updating policy for CPU %u\n", policy->cpu); in refresh_frequency_limits()
1209 cpufreq_set_policy(policy, policy->governor, policy->policy); in refresh_frequency_limits()
1216 struct cpufreq_policy *policy = in handle_update() local
1219 pr_debug("handle_update for cpu %u called\n", policy->cpu); in handle_update()
1221 guard(cpufreq_policy_write)(policy); in handle_update()
1223 refresh_frequency_limits(policy); in handle_update()
1229 struct cpufreq_policy *policy = container_of(nb, struct cpufreq_policy, nb_min); in cpufreq_notifier_min() local
1231 schedule_work(&policy->update); in cpufreq_notifier_min()
1238 struct cpufreq_policy *policy = container_of(nb, struct cpufreq_policy, nb_max); in cpufreq_notifier_max() local
1240 schedule_work(&policy->update); in cpufreq_notifier_max()
1244 static void cpufreq_policy_put_kobj(struct cpufreq_policy *policy) in cpufreq_policy_put_kobj() argument
1249 scoped_guard(cpufreq_policy_write, policy) { in cpufreq_policy_put_kobj()
1250 cpufreq_stats_free_table(policy); in cpufreq_policy_put_kobj()
1251 kobj = &policy->kobj; in cpufreq_policy_put_kobj()
1252 cmp = &policy->kobj_unregister; in cpufreq_policy_put_kobj()
1268 struct cpufreq_policy *policy; in cpufreq_policy_alloc() local
1275 policy = kzalloc_obj(*policy); in cpufreq_policy_alloc()
1276 if (!policy) in cpufreq_policy_alloc()
1279 if (!alloc_cpumask_var(&policy->cpus, GFP_KERNEL)) in cpufreq_policy_alloc()
1282 if (!zalloc_cpumask_var(&policy->related_cpus, GFP_KERNEL)) in cpufreq_policy_alloc()
1285 if (!zalloc_cpumask_var(&policy->real_cpus, GFP_KERNEL)) in cpufreq_policy_alloc()
1288 init_completion(&policy->kobj_unregister); in cpufreq_policy_alloc()
1289 ret = kobject_init_and_add(&policy->kobj, &ktype_cpufreq, in cpufreq_policy_alloc()
1298 kobject_put(&policy->kobj); in cpufreq_policy_alloc()
1302 init_rwsem(&policy->rwsem); in cpufreq_policy_alloc()
1304 freq_constraints_init(&policy->constraints); in cpufreq_policy_alloc()
1306 policy->nb_min.notifier_call = cpufreq_notifier_min; in cpufreq_policy_alloc()
1307 policy->nb_max.notifier_call = cpufreq_notifier_max; in cpufreq_policy_alloc()
1309 ret = freq_qos_add_notifier(&policy->constraints, FREQ_QOS_MIN, in cpufreq_policy_alloc()
1310 &policy->nb_min); in cpufreq_policy_alloc()
1317 ret = freq_qos_add_notifier(&policy->constraints, FREQ_QOS_MAX, in cpufreq_policy_alloc()
1318 &policy->nb_max); in cpufreq_policy_alloc()
1325 INIT_LIST_HEAD(&policy->policy_list); in cpufreq_policy_alloc()
1326 spin_lock_init(&policy->transition_lock); in cpufreq_policy_alloc()
1327 init_waitqueue_head(&policy->transition_wait); in cpufreq_policy_alloc()
1328 INIT_WORK(&policy->update, handle_update); in cpufreq_policy_alloc()
1330 return policy; in cpufreq_policy_alloc()
1333 freq_qos_remove_notifier(&policy->constraints, FREQ_QOS_MIN, in cpufreq_policy_alloc()
1334 &policy->nb_min); in cpufreq_policy_alloc()
1336 cpufreq_policy_put_kobj(policy); in cpufreq_policy_alloc()
1338 free_cpumask_var(policy->real_cpus); in cpufreq_policy_alloc()
1340 free_cpumask_var(policy->related_cpus); in cpufreq_policy_alloc()
1342 free_cpumask_var(policy->cpus); in cpufreq_policy_alloc()
1344 kfree(policy); in cpufreq_policy_alloc()
1349 static void cpufreq_policy_free(struct cpufreq_policy *policy) in cpufreq_policy_free() argument
1358 if (unlikely(!policy_is_inactive(policy))) in cpufreq_policy_free()
1363 list_del(&policy->policy_list); in cpufreq_policy_free()
1365 for_each_cpu(cpu, policy->related_cpus) in cpufreq_policy_free()
1369 freq_qos_remove_notifier(&policy->constraints, FREQ_QOS_MAX, in cpufreq_policy_free()
1370 &policy->nb_max); in cpufreq_policy_free()
1371 freq_qos_remove_notifier(&policy->constraints, FREQ_QOS_MIN, in cpufreq_policy_free()
1372 &policy->nb_min); in cpufreq_policy_free()
1375 cancel_work_sync(&policy->update); in cpufreq_policy_free()
1377 if (freq_qos_request_active(&policy->max_freq_req)) { in cpufreq_policy_free()
1384 CPUFREQ_REMOVE_POLICY, policy); in cpufreq_policy_free()
1385 freq_qos_remove_request(&policy->max_freq_req); in cpufreq_policy_free()
1388 if (freq_qos_request_active(&policy->min_freq_req)) in cpufreq_policy_free()
1389 freq_qos_remove_request(&policy->min_freq_req); in cpufreq_policy_free()
1390 if (freq_qos_request_active(&policy->boost_freq_req)) in cpufreq_policy_free()
1391 freq_qos_remove_request(&policy->boost_freq_req); in cpufreq_policy_free()
1393 cpufreq_policy_put_kobj(policy); in cpufreq_policy_free()
1394 free_cpumask_var(policy->real_cpus); in cpufreq_policy_free()
1395 free_cpumask_var(policy->related_cpus); in cpufreq_policy_free()
1396 free_cpumask_var(policy->cpus); in cpufreq_policy_free()
1397 kfree(policy); in cpufreq_policy_free()
1400 static int cpufreq_policy_online(struct cpufreq_policy *policy, in cpufreq_policy_online() argument
1407 guard(cpufreq_policy_write)(policy); in cpufreq_policy_online()
1409 policy->cpu = cpu; in cpufreq_policy_online()
1410 policy->governor = NULL; in cpufreq_policy_online()
1414 cpumask_copy(policy->cpus, policy->related_cpus); in cpufreq_policy_online()
1416 ret = cpufreq_driver->online(policy); in cpufreq_policy_online()
1423 cpumask_copy(policy->cpus, cpumask_of(cpu)); in cpufreq_policy_online()
1429 ret = cpufreq_driver->init(policy); in cpufreq_policy_online()
1441 ret = cpufreq_table_validate_and_sort(policy); in cpufreq_policy_online()
1446 cpumask_copy(policy->related_cpus, policy->cpus); in cpufreq_policy_online()
1453 cpumask_and(policy->cpus, policy->cpus, cpu_online_mask); in cpufreq_policy_online()
1456 for_each_cpu(j, policy->related_cpus) { in cpufreq_policy_online()
1457 per_cpu(cpufreq_cpu_data, j) = policy; in cpufreq_policy_online()
1458 add_cpu_dev_symlink(policy, j, get_cpu_device(j)); in cpufreq_policy_online()
1461 if (policy->boost_supported) { in cpufreq_policy_online()
1462 ret = freq_qos_add_request(&policy->constraints, in cpufreq_policy_online()
1463 &policy->boost_freq_req, in cpufreq_policy_online()
1465 policy->cpuinfo.max_freq); in cpufreq_policy_online()
1470 ret = freq_qos_add_request(&policy->constraints, in cpufreq_policy_online()
1471 &policy->min_freq_req, FREQ_QOS_MIN, in cpufreq_policy_online()
1476 ret = freq_qos_add_request(&policy->constraints, in cpufreq_policy_online()
1477 &policy->max_freq_req, FREQ_QOS_MAX, in cpufreq_policy_online()
1483 CPUFREQ_CREATE_POLICY, policy); in cpufreq_policy_online()
1487 policy->cur = cpufreq_driver->get(policy->cpu); in cpufreq_policy_online()
1488 if (!policy->cur) { in cpufreq_policy_online()
1515 unsigned int old_freq = policy->cur; in cpufreq_policy_online()
1518 ret = cpufreq_frequency_table_get_index(policy, old_freq); in cpufreq_policy_online()
1520 ret = __cpufreq_driver_target(policy, old_freq - 1, in cpufreq_policy_online()
1530 __func__, policy->cpu, old_freq, policy->cur); in cpufreq_policy_online()
1535 ret = cpufreq_add_dev_interface(policy); in cpufreq_policy_online()
1539 cpufreq_stats_create_table(policy); in cpufreq_policy_online()
1542 list_add(&policy->policy_list, &cpufreq_policy_list); in cpufreq_policy_online()
1556 cpufreq_driver->register_em(policy); in cpufreq_policy_online()
1559 ret = cpufreq_init_policy(policy); in cpufreq_policy_online()
1569 for_each_cpu(j, policy->real_cpus) in cpufreq_policy_online()
1570 remove_cpu_dev_symlink(policy, j, get_cpu_device(j)); in cpufreq_policy_online()
1574 cpufreq_driver->offline(policy); in cpufreq_policy_online()
1578 cpufreq_driver->exit(policy); in cpufreq_policy_online()
1581 cpumask_clear(policy->cpus); in cpufreq_policy_online()
1588 struct cpufreq_policy *policy; in cpufreq_online() local
1595 policy = per_cpu(cpufreq_cpu_data, cpu); in cpufreq_online()
1596 if (policy) { in cpufreq_online()
1597 WARN_ON(!cpumask_test_cpu(cpu, policy->related_cpus)); in cpufreq_online()
1598 if (!policy_is_inactive(policy)) in cpufreq_online()
1599 return cpufreq_add_policy_cpu(policy, cpu); in cpufreq_online()
1605 policy = cpufreq_policy_alloc(cpu); in cpufreq_online()
1606 if (!policy) in cpufreq_online()
1610 ret = cpufreq_policy_online(policy, cpu, new_policy); in cpufreq_online()
1612 cpufreq_policy_free(policy); in cpufreq_online()
1616 kobject_uevent(&policy->kobj, KOBJ_ADD); in cpufreq_online()
1620 cpufreq_driver->ready(policy); in cpufreq_online()
1624 policy->cdev = of_cpufreq_cooling_register(policy); in cpufreq_online()
1631 if (cpufreq_driver->set_boost && policy->boost_supported && in cpufreq_online()
1633 ret = policy_set_boost(policy, cpufreq_boost_enabled()); in cpufreq_online()
1636 pr_info("%s: CPU%d: Cannot %s BOOST\n", __func__, policy->cpu, in cpufreq_online()
1653 struct cpufreq_policy *policy; in cpufreq_add_dev() local
1666 policy = per_cpu(cpufreq_cpu_data, cpu); in cpufreq_add_dev()
1667 if (policy) in cpufreq_add_dev()
1668 add_cpu_dev_symlink(policy, cpu, dev); in cpufreq_add_dev()
1673 static void __cpufreq_offline(unsigned int cpu, struct cpufreq_policy *policy) in __cpufreq_offline() argument
1678 cpufreq_stop_governor(policy); in __cpufreq_offline()
1680 cpumask_clear_cpu(cpu, policy->cpus); in __cpufreq_offline()
1682 if (!policy_is_inactive(policy)) { in __cpufreq_offline()
1684 if (cpu == policy->cpu) in __cpufreq_offline()
1685 policy->cpu = cpumask_any(policy->cpus); in __cpufreq_offline()
1689 ret = cpufreq_start_governor(policy); in __cpufreq_offline()
1698 strscpy(policy->last_governor, policy->governor->name, in __cpufreq_offline()
1700 cpufreq_exit_governor(policy); in __cpufreq_offline()
1702 policy->last_policy = policy->policy; in __cpufreq_offline()
1710 cpufreq_driver->offline(policy); in __cpufreq_offline()
1715 cpufreq_driver->exit(policy); in __cpufreq_offline()
1717 policy->freq_table = NULL; in __cpufreq_offline()
1722 struct cpufreq_policy *policy; in cpufreq_offline() local
1726 policy = cpufreq_cpu_get_raw(cpu); in cpufreq_offline()
1727 if (!policy) { in cpufreq_offline()
1732 guard(cpufreq_policy_write)(policy); in cpufreq_offline()
1734 __cpufreq_offline(cpu, policy); in cpufreq_offline()
1747 struct cpufreq_policy *policy = per_cpu(cpufreq_cpu_data, cpu); in cpufreq_remove_dev() local
1749 if (!policy) in cpufreq_remove_dev()
1752 scoped_guard(cpufreq_policy_write, policy) { in cpufreq_remove_dev()
1754 __cpufreq_offline(cpu, policy); in cpufreq_remove_dev()
1756 remove_cpu_dev_symlink(policy, cpu, dev); in cpufreq_remove_dev()
1758 if (!cpumask_empty(policy->real_cpus)) in cpufreq_remove_dev()
1766 cpufreq_cooling_unregister(policy->cdev); in cpufreq_remove_dev()
1767 policy->cdev = NULL; in cpufreq_remove_dev()
1772 cpufreq_driver->exit(policy); in cpufreq_remove_dev()
1775 cpufreq_policy_free(policy); in cpufreq_remove_dev()
1786 static void cpufreq_out_of_sync(struct cpufreq_policy *policy, in cpufreq_out_of_sync() argument
1792 policy->cur, new_freq); in cpufreq_out_of_sync()
1794 freqs.old = policy->cur; in cpufreq_out_of_sync()
1797 cpufreq_freq_transition_begin(policy, &freqs); in cpufreq_out_of_sync()
1798 cpufreq_freq_transition_end(policy, &freqs, 0); in cpufreq_out_of_sync()
1801 static unsigned int cpufreq_verify_current_freq(struct cpufreq_policy *policy, bool update) in cpufreq_verify_current_freq() argument
1808 new_freq = cpufreq_driver->get(policy->cpu); in cpufreq_verify_current_freq()
1816 if (policy->fast_switch_enabled || !has_target()) in cpufreq_verify_current_freq()
1819 if (policy->cur != new_freq) { in cpufreq_verify_current_freq()
1827 if (abs(policy->cur - new_freq) < KHZ_PER_MHZ) in cpufreq_verify_current_freq()
1828 return policy->cur; in cpufreq_verify_current_freq()
1830 cpufreq_out_of_sync(policy, new_freq); in cpufreq_verify_current_freq()
1832 schedule_work(&policy->update); in cpufreq_verify_current_freq()
1861 struct cpufreq_policy *policy __free(put_cpufreq_policy) = cpufreq_cpu_get(cpu); in cpufreq_quick_get()
1862 if (policy) in cpufreq_quick_get()
1863 return policy->cur; in cpufreq_quick_get()
1877 struct cpufreq_policy *policy __free(put_cpufreq_policy) = cpufreq_cpu_get(cpu); in cpufreq_quick_get_max()
1878 if (policy) in cpufreq_quick_get_max()
1879 return policy->max; in cpufreq_quick_get_max()
1893 struct cpufreq_policy *policy __free(put_cpufreq_policy) = cpufreq_cpu_get(cpu); in cpufreq_get_hw_max_freq()
1894 if (policy) in cpufreq_get_hw_max_freq()
1895 return policy->cpuinfo.max_freq; in cpufreq_get_hw_max_freq()
1901 static unsigned int __cpufreq_get(struct cpufreq_policy *policy) in __cpufreq_get() argument
1903 if (unlikely(policy_is_inactive(policy))) in __cpufreq_get()
1906 return cpufreq_verify_current_freq(policy, true); in __cpufreq_get()
1917 struct cpufreq_policy *policy __free(put_cpufreq_policy) = cpufreq_cpu_get(cpu); in cpufreq_get()
1918 if (!policy) in cpufreq_get()
1921 guard(cpufreq_policy_read)(policy); in cpufreq_get()
1923 return __cpufreq_get(policy); in cpufreq_get()
1938 int cpufreq_generic_suspend(struct cpufreq_policy *policy) in cpufreq_generic_suspend() argument
1942 if (!policy->suspend_freq) { in cpufreq_generic_suspend()
1948 policy->suspend_freq); in cpufreq_generic_suspend()
1950 ret = __cpufreq_driver_target(policy, policy->suspend_freq, in cpufreq_generic_suspend()
1954 __func__, policy->suspend_freq, ret); in cpufreq_generic_suspend()
1970 struct cpufreq_policy *policy; in cpufreq_suspend() local
1980 for_each_active_policy(policy) { in cpufreq_suspend()
1982 scoped_guard(cpufreq_policy_write, policy) { in cpufreq_suspend()
1983 cpufreq_stop_governor(policy); in cpufreq_suspend()
1987 if (cpufreq_driver->suspend && cpufreq_driver->suspend(policy)) in cpufreq_suspend()
2004 struct cpufreq_policy *policy; in cpufreq_resume() local
2020 for_each_active_policy(policy) { in cpufreq_resume()
2021 if (cpufreq_driver->resume && cpufreq_driver->resume(policy)) { in cpufreq_resume()
2025 scoped_guard(cpufreq_policy_write, policy) { in cpufreq_resume()
2026 ret = cpufreq_start_governor(policy); in cpufreq_resume()
2031 __func__, policy->cpu); in cpufreq_resume()
2196 unsigned int cpufreq_driver_fast_switch(struct cpufreq_policy *policy, in cpufreq_driver_fast_switch() argument
2202 target_freq = clamp_val(target_freq, policy->min, policy->max); in cpufreq_driver_fast_switch()
2203 freq = cpufreq_driver->fast_switch(policy, target_freq); in cpufreq_driver_fast_switch()
2208 policy->cur = freq; in cpufreq_driver_fast_switch()
2209 arch_set_freq_scale(policy->related_cpus, freq, in cpufreq_driver_fast_switch()
2210 arch_scale_freq_ref(policy->cpu)); in cpufreq_driver_fast_switch()
2211 cpufreq_stats_record_transition(policy, freq); in cpufreq_driver_fast_switch()
2214 for_each_cpu(cpu, policy->cpus) in cpufreq_driver_fast_switch()
2243 void cpufreq_driver_adjust_perf(struct cpufreq_policy *policy, in cpufreq_driver_adjust_perf() argument
2248 cpufreq_driver->adjust_perf(policy, min_perf, target_perf, capacity); in cpufreq_driver_adjust_perf()
2263 static int __target_intermediate(struct cpufreq_policy *policy, in __target_intermediate() argument
2268 freqs->new = cpufreq_driver->get_intermediate(policy, index); in __target_intermediate()
2275 __func__, policy->cpu, freqs->old, freqs->new); in __target_intermediate()
2277 cpufreq_freq_transition_begin(policy, freqs); in __target_intermediate()
2278 ret = cpufreq_driver->target_intermediate(policy, index); in __target_intermediate()
2279 cpufreq_freq_transition_end(policy, freqs, ret); in __target_intermediate()
2288 static int __target_index(struct cpufreq_policy *policy, int index) in __target_index() argument
2290 struct cpufreq_freqs freqs = {.old = policy->cur, .flags = 0}; in __target_index()
2292 unsigned int newfreq = policy->freq_table[index].frequency; in __target_index()
2296 if (newfreq == policy->cur) in __target_index()
2300 restore_freq = policy->cur; in __target_index()
2306 retval = __target_intermediate(policy, &freqs, index); in __target_index()
2318 __func__, policy->cpu, freqs.old, freqs.new); in __target_index()
2320 cpufreq_freq_transition_begin(policy, &freqs); in __target_index()
2323 retval = cpufreq_driver->target_index(policy, index); in __target_index()
2329 cpufreq_freq_transition_end(policy, &freqs, retval); in __target_index()
2340 cpufreq_freq_transition_begin(policy, &freqs); in __target_index()
2341 cpufreq_freq_transition_end(policy, &freqs, 0); in __target_index()
2348 int __cpufreq_driver_target(struct cpufreq_policy *policy, in __cpufreq_driver_target() argument
2357 target_freq = __resolve_freq(policy, target_freq, policy->min, in __cpufreq_driver_target()
2358 policy->max, relation); in __cpufreq_driver_target()
2361 policy->cpu, policy->cur, target_freq, old_target_freq, relation); in __cpufreq_driver_target()
2369 if (target_freq == policy->cur && in __cpufreq_driver_target()
2378 if (!policy->efficiencies_available) in __cpufreq_driver_target()
2381 return cpufreq_driver->target(policy, target_freq, relation); in __cpufreq_driver_target()
2387 return __target_index(policy, policy->cached_resolved_idx); in __cpufreq_driver_target()
2391 int cpufreq_driver_target(struct cpufreq_policy *policy, in cpufreq_driver_target() argument
2395 guard(cpufreq_policy_write)(policy); in cpufreq_driver_target()
2397 return __cpufreq_driver_target(policy, target_freq, relation); in cpufreq_driver_target()
2406 static int cpufreq_init_governor(struct cpufreq_policy *policy) in cpufreq_init_governor() argument
2417 if (!policy->governor) in cpufreq_init_governor()
2421 if (policy->governor->flags & CPUFREQ_GOV_DYNAMIC_SWITCHING && in cpufreq_init_governor()
2427 policy->governor->name, gov->name); in cpufreq_init_governor()
2428 policy->governor = gov; in cpufreq_init_governor()
2434 if (!try_module_get(policy->governor->owner)) in cpufreq_init_governor()
2437 pr_debug("%s: for CPU %u\n", __func__, policy->cpu); in cpufreq_init_governor()
2439 if (policy->governor->init) { in cpufreq_init_governor()
2440 ret = policy->governor->init(policy); in cpufreq_init_governor()
2442 module_put(policy->governor->owner); in cpufreq_init_governor()
2447 policy->strict_target = !!(policy->governor->flags & CPUFREQ_GOV_STRICT_TARGET); in cpufreq_init_governor()
2452 static void cpufreq_exit_governor(struct cpufreq_policy *policy) in cpufreq_exit_governor() argument
2454 if (cpufreq_suspended || !policy->governor) in cpufreq_exit_governor()
2457 pr_debug("%s: for CPU %u\n", __func__, policy->cpu); in cpufreq_exit_governor()
2459 if (policy->governor->exit) in cpufreq_exit_governor()
2460 policy->governor->exit(policy); in cpufreq_exit_governor()
2462 module_put(policy->governor->owner); in cpufreq_exit_governor()
2465 int cpufreq_start_governor(struct cpufreq_policy *policy) in cpufreq_start_governor() argument
2472 if (!policy->governor) in cpufreq_start_governor()
2475 pr_debug("%s: for CPU %u\n", __func__, policy->cpu); in cpufreq_start_governor()
2477 cpufreq_verify_current_freq(policy, false); in cpufreq_start_governor()
2479 if (policy->governor->start) { in cpufreq_start_governor()
2480 ret = policy->governor->start(policy); in cpufreq_start_governor()
2485 if (policy->governor->limits) in cpufreq_start_governor()
2486 policy->governor->limits(policy); in cpufreq_start_governor()
2491 void cpufreq_stop_governor(struct cpufreq_policy *policy) in cpufreq_stop_governor() argument
2493 if (cpufreq_suspended || !policy->governor) in cpufreq_stop_governor()
2496 pr_debug("%s: for CPU %u\n", __func__, policy->cpu); in cpufreq_stop_governor()
2498 if (policy->governor->stop) in cpufreq_stop_governor()
2499 policy->governor->stop(policy); in cpufreq_stop_governor()
2502 static void cpufreq_governor_limits(struct cpufreq_policy *policy) in cpufreq_governor_limits() argument
2504 if (cpufreq_suspended || !policy->governor) in cpufreq_governor_limits()
2507 pr_debug("%s: for CPU %u\n", __func__, policy->cpu); in cpufreq_governor_limits()
2509 if (policy->governor->limits) in cpufreq_governor_limits()
2510 policy->governor->limits(policy); in cpufreq_governor_limits()
2538 struct cpufreq_policy *policy; in cpufreq_unregister_governor() local
2549 for_each_inactive_policy(policy) { in cpufreq_unregister_governor()
2550 if (!strcmp(policy->last_governor, governor->name)) { in cpufreq_unregister_governor()
2551 policy->governor = NULL; in cpufreq_unregister_governor()
2552 policy->last_governor[0] = '\0'; in cpufreq_unregister_governor()
2576 static void cpufreq_update_pressure(struct cpufreq_policy *policy) in cpufreq_update_pressure() argument
2582 cpu = cpumask_first(policy->related_cpus); in cpufreq_update_pressure()
2584 capped_freq = policy->max; in cpufreq_update_pressure()
2598 for_each_cpu(cpu, policy->related_cpus) in cpufreq_update_pressure()
2617 static int cpufreq_set_policy(struct cpufreq_policy *policy, in cpufreq_set_policy() argument
2625 memcpy(&new_data.cpuinfo, &policy->cpuinfo, sizeof(policy->cpuinfo)); in cpufreq_set_policy()
2626 new_data.freq_table = policy->freq_table; in cpufreq_set_policy()
2627 new_data.cpu = policy->cpu; in cpufreq_set_policy()
2632 new_data.min = freq_qos_read_value(&policy->constraints, FREQ_QOS_MIN); in cpufreq_set_policy()
2633 new_data.max = freq_qos_read_value(&policy->constraints, FREQ_QOS_MAX); in cpufreq_set_policy()
2655 WRITE_ONCE(policy->max, __resolve_freq(policy, new_data.max, in cpufreq_set_policy()
2658 new_data.min = __resolve_freq(policy, new_data.min, new_data.min, in cpufreq_set_policy()
2660 WRITE_ONCE(policy->min, new_data.min > policy->max ? policy->max : new_data.min); in cpufreq_set_policy()
2662 trace_cpu_frequency_limits(policy); in cpufreq_set_policy()
2664 cpufreq_update_pressure(policy); in cpufreq_set_policy()
2666 policy->cached_target_freq = UINT_MAX; in cpufreq_set_policy()
2669 policy->min, policy->max); in cpufreq_set_policy()
2672 policy->policy = new_pol; in cpufreq_set_policy()
2674 return cpufreq_driver->setpolicy(policy); in cpufreq_set_policy()
2677 if (new_gov == policy->governor) { in cpufreq_set_policy()
2679 cpufreq_governor_limits(policy); in cpufreq_set_policy()
2686 old_gov = policy->governor; in cpufreq_set_policy()
2689 cpufreq_stop_governor(policy); in cpufreq_set_policy()
2690 cpufreq_exit_governor(policy); in cpufreq_set_policy()
2694 policy->governor = new_gov; in cpufreq_set_policy()
2695 ret = cpufreq_init_governor(policy); in cpufreq_set_policy()
2697 ret = cpufreq_start_governor(policy); in cpufreq_set_policy()
2702 cpufreq_exit_governor(policy); in cpufreq_set_policy()
2706 pr_debug("starting governor %s failed\n", policy->governor->name); in cpufreq_set_policy()
2708 policy->governor = old_gov; in cpufreq_set_policy()
2709 if (cpufreq_init_governor(policy)) { in cpufreq_set_policy()
2710 policy->governor = NULL; in cpufreq_set_policy()
2711 } else if (cpufreq_start_governor(policy)) { in cpufreq_set_policy()
2712 cpufreq_exit_governor(policy); in cpufreq_set_policy()
2713 policy->governor = NULL; in cpufreq_set_policy()
2720 static void cpufreq_policy_refresh(struct cpufreq_policy *policy) in cpufreq_policy_refresh() argument
2722 guard(cpufreq_policy_write)(policy); in cpufreq_policy_refresh()
2729 (cpufreq_suspended || WARN_ON(!cpufreq_verify_current_freq(policy, false)))) in cpufreq_policy_refresh()
2732 refresh_frequency_limits(policy); in cpufreq_policy_refresh()
2746 struct cpufreq_policy *policy __free(put_cpufreq_policy) = cpufreq_cpu_get(cpu); in cpufreq_update_policy()
2747 if (!policy) in cpufreq_update_policy()
2750 cpufreq_policy_refresh(policy); in cpufreq_update_policy()
2763 struct cpufreq_policy *policy __free(put_cpufreq_policy) = cpufreq_cpu_get(cpu); in cpufreq_update_limits()
2764 if (!policy) in cpufreq_update_limits()
2768 cpufreq_driver->update_limits(policy); in cpufreq_update_limits()
2770 cpufreq_policy_refresh(policy); in cpufreq_update_limits()
2777 int cpufreq_boost_set_sw(struct cpufreq_policy *policy, int state) in cpufreq_boost_set_sw() argument
2781 if (!policy->freq_table) in cpufreq_boost_set_sw()
2784 ret = cpufreq_frequency_table_cpuinfo(policy); in cpufreq_boost_set_sw()
2794 struct cpufreq_policy *policy; in cpufreq_boost_trigger_state() local
2808 for_each_active_policy(policy) { in cpufreq_boost_trigger_state()
2809 if (!policy->boost_supported) in cpufreq_boost_trigger_state()
2812 ret = policy_set_boost(policy, state); in cpufreq_boost_trigger_state()
3041 struct cpufreq_policy *policy __free(put_cpufreq_policy) = cpufreq_cpu_get(cpu); in cpufreq_policy_is_good_for_eas()
3042 if (!policy) { in cpufreq_policy_is_good_for_eas()
3047 return sugov_is_governor(policy); in cpufreq_policy_is_good_for_eas()