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()
203 struct cpufreq_policy *policy = cpufreq_cpu_get_raw(cpu); in cpufreq_generic_get() local
205 if (!policy || IS_ERR(policy->clk)) { in cpufreq_generic_get()
207 __func__, policy ? "clk" : "policy", cpu); in cpufreq_generic_get()
211 return clk_get_rate(policy->clk) / 1000; in cpufreq_generic_get()
228 struct cpufreq_policy *policy = NULL; in cpufreq_cpu_get() local
239 policy = cpufreq_cpu_get_raw(cpu); in cpufreq_cpu_get()
240 if (policy) in cpufreq_cpu_get()
241 kobject_get(&policy->kobj); in cpufreq_cpu_get()
246 return policy; in cpufreq_cpu_get()
254 void cpufreq_cpu_put(struct cpufreq_policy *policy) in cpufreq_cpu_put() argument
256 kobject_put(&policy->kobj); in cpufreq_cpu_put()
308 static void cpufreq_notify_transition(struct cpufreq_policy *policy, in cpufreq_notify_transition() argument
319 freqs->policy = policy; in cpufreq_notify_transition()
331 if (policy->cur && policy->cur != freqs->old) { in cpufreq_notify_transition()
333 freqs->old, policy->cur); in cpufreq_notify_transition()
334 freqs->old = policy->cur; in cpufreq_notify_transition()
346 cpumask_pr_args(policy->cpus)); in cpufreq_notify_transition()
348 for_each_cpu(cpu, policy->cpus) in cpufreq_notify_transition()
354 cpufreq_stats_record_transition(policy, freqs->new); in cpufreq_notify_transition()
355 policy->cur = freqs->new; in cpufreq_notify_transition()
360 static void cpufreq_notify_post_transition(struct cpufreq_policy *policy, in cpufreq_notify_post_transition() argument
363 cpufreq_notify_transition(policy, freqs, CPUFREQ_POSTCHANGE); in cpufreq_notify_post_transition()
368 cpufreq_notify_transition(policy, freqs, CPUFREQ_PRECHANGE); in cpufreq_notify_post_transition()
369 cpufreq_notify_transition(policy, freqs, CPUFREQ_POSTCHANGE); in cpufreq_notify_post_transition()
372 void cpufreq_freq_transition_begin(struct cpufreq_policy *policy, in cpufreq_freq_transition_begin() argument
385 && current == policy->transition_task); in cpufreq_freq_transition_begin()
388 wait_event(policy->transition_wait, !policy->transition_ongoing); in cpufreq_freq_transition_begin()
390 spin_lock(&policy->transition_lock); in cpufreq_freq_transition_begin()
392 if (unlikely(policy->transition_ongoing)) { in cpufreq_freq_transition_begin()
393 spin_unlock(&policy->transition_lock); in cpufreq_freq_transition_begin()
397 policy->transition_ongoing = true; in cpufreq_freq_transition_begin()
398 policy->transition_task = current; in cpufreq_freq_transition_begin()
400 spin_unlock(&policy->transition_lock); in cpufreq_freq_transition_begin()
402 cpufreq_notify_transition(policy, freqs, CPUFREQ_PRECHANGE); in cpufreq_freq_transition_begin()
406 void cpufreq_freq_transition_end(struct cpufreq_policy *policy, in cpufreq_freq_transition_end() argument
409 if (WARN_ON(!policy->transition_ongoing)) in cpufreq_freq_transition_end()
412 cpufreq_notify_post_transition(policy, freqs, transition_failed); in cpufreq_freq_transition_end()
414 arch_set_freq_scale(policy->related_cpus, in cpufreq_freq_transition_end()
415 policy->cur, in cpufreq_freq_transition_end()
416 arch_scale_freq_ref(policy->cpu)); in cpufreq_freq_transition_end()
418 spin_lock(&policy->transition_lock); in cpufreq_freq_transition_end()
419 policy->transition_ongoing = false; in cpufreq_freq_transition_end()
420 policy->transition_task = NULL; in cpufreq_freq_transition_end()
421 spin_unlock(&policy->transition_lock); in cpufreq_freq_transition_end()
423 wake_up(&policy->transition_wait); in cpufreq_freq_transition_end()
459 void cpufreq_enable_fast_switch(struct cpufreq_policy *policy) in cpufreq_enable_fast_switch() argument
461 lockdep_assert_held(&policy->rwsem); in cpufreq_enable_fast_switch()
463 if (!policy->fast_switch_possible) in cpufreq_enable_fast_switch()
469 policy->fast_switch_enabled = true; in cpufreq_enable_fast_switch()
472 policy->cpu); in cpufreq_enable_fast_switch()
483 void cpufreq_disable_fast_switch(struct cpufreq_policy *policy) in cpufreq_disable_fast_switch() argument
486 if (policy->fast_switch_enabled) { in cpufreq_disable_fast_switch()
487 policy->fast_switch_enabled = false; in cpufreq_disable_fast_switch()
495 static unsigned int __resolve_freq(struct cpufreq_policy *policy, in __resolve_freq() argument
504 if (!policy->freq_table) in __resolve_freq()
507 idx = cpufreq_frequency_table_target(policy, target_freq, min, max, relation); in __resolve_freq()
508 policy->cached_resolved_idx = idx; in __resolve_freq()
509 policy->cached_target_freq = target_freq; in __resolve_freq()
510 return policy->freq_table[idx].frequency; in __resolve_freq()
524 unsigned int cpufreq_driver_resolve_freq(struct cpufreq_policy *policy, in cpufreq_driver_resolve_freq() argument
527 unsigned int min = READ_ONCE(policy->min); in cpufreq_driver_resolve_freq()
528 unsigned int max = READ_ONCE(policy->max); in cpufreq_driver_resolve_freq()
541 return __resolve_freq(policy, target_freq, min, max, CPUFREQ_RELATION_LE); in cpufreq_driver_resolve_freq()
545 unsigned int cpufreq_policy_transition_delay_us(struct cpufreq_policy *policy) in cpufreq_policy_transition_delay_us() argument
549 if (policy->transition_delay_us) in cpufreq_policy_transition_delay_us()
550 return policy->transition_delay_us; in cpufreq_policy_transition_delay_us()
552 latency = policy->cpuinfo.transition_latency / NSEC_PER_USEC; in cpufreq_policy_transition_delay_us()
591 static ssize_t show_local_boost(struct cpufreq_policy *policy, char *buf) in show_local_boost() argument
593 return sysfs_emit(buf, "%d\n", policy->boost_enabled); in show_local_boost()
596 static int policy_set_boost(struct cpufreq_policy *policy, bool enable) in policy_set_boost() argument
600 if (policy->boost_enabled == enable) in policy_set_boost()
603 policy->boost_enabled = enable; in policy_set_boost()
605 ret = cpufreq_driver->set_boost(policy, enable); in policy_set_boost()
607 policy->boost_enabled = !policy->boost_enabled; in policy_set_boost()
612 static ssize_t store_local_boost(struct cpufreq_policy *policy, in store_local_boost() argument
624 if (!policy->boost_supported) in store_local_boost()
627 ret = policy_set_boost(policy, enable); in store_local_boost()
704 (struct cpufreq_policy *policy, char *buf) \
706 return sysfs_emit(buf, "%u\n", policy->object); \
720 static inline bool cpufreq_avg_freq_supported(struct cpufreq_policy *policy) in cpufreq_avg_freq_supported() argument
722 return arch_freq_get_on_cpu(policy->cpu) != -EOPNOTSUPP; in cpufreq_avg_freq_supported()
725 static ssize_t show_scaling_cur_freq(struct cpufreq_policy *policy, char *buf) in show_scaling_cur_freq() argument
731 ? arch_freq_get_on_cpu(policy->cpu) in show_scaling_cur_freq()
737 ret = sysfs_emit(buf, "%u\n", cpufreq_driver->get(policy->cpu)); in show_scaling_cur_freq()
739 ret = sysfs_emit(buf, "%u\n", policy->cur); in show_scaling_cur_freq()
748 (struct cpufreq_policy *policy, const char *buf, size_t count) \
757 ret = freq_qos_update_request(policy->object##_freq_req, val);\
767 static ssize_t show_cpuinfo_cur_freq(struct cpufreq_policy *policy, in show_cpuinfo_cur_freq() argument
770 unsigned int cur_freq = __cpufreq_get(policy); in show_cpuinfo_cur_freq()
781 static ssize_t show_cpuinfo_avg_freq(struct cpufreq_policy *policy, in show_cpuinfo_avg_freq() argument
784 int avg_freq = arch_freq_get_on_cpu(policy->cpu); in show_cpuinfo_avg_freq()
794 static ssize_t show_scaling_governor(struct cpufreq_policy *policy, char *buf) in show_scaling_governor() argument
796 if (policy->policy == CPUFREQ_POLICY_POWERSAVE) in show_scaling_governor()
798 else if (policy->policy == CPUFREQ_POLICY_PERFORMANCE) in show_scaling_governor()
800 else if (policy->governor) in show_scaling_governor()
801 return sysfs_emit(buf, "%s\n", policy->governor->name); in show_scaling_governor()
808 static ssize_t store_scaling_governor(struct cpufreq_policy *policy, in store_scaling_governor() argument
825 ret = cpufreq_set_policy(policy, NULL, new_pol); in store_scaling_governor()
833 ret = cpufreq_set_policy(policy, new_gov, in store_scaling_governor()
845 static ssize_t show_scaling_driver(struct cpufreq_policy *policy, char *buf) in show_scaling_driver() argument
853 static ssize_t show_scaling_available_governors(struct cpufreq_policy *policy, in show_scaling_available_governors() argument
900 static ssize_t show_related_cpus(struct cpufreq_policy *policy, char *buf) in show_related_cpus() argument
902 return cpufreq_show_cpus(policy->related_cpus, buf); in show_related_cpus()
908 static ssize_t show_affected_cpus(struct cpufreq_policy *policy, char *buf) in show_affected_cpus() argument
910 return cpufreq_show_cpus(policy->cpus, buf); in show_affected_cpus()
913 static ssize_t store_scaling_setspeed(struct cpufreq_policy *policy, in store_scaling_setspeed() argument
919 if (!policy->governor || !policy->governor->store_setspeed) in store_scaling_setspeed()
926 policy->governor->store_setspeed(policy, freq); in store_scaling_setspeed()
931 static ssize_t show_scaling_setspeed(struct cpufreq_policy *policy, char *buf) in show_scaling_setspeed() argument
933 if (!policy->governor || !policy->governor->show_setspeed) in show_scaling_setspeed()
936 return policy->governor->show_setspeed(policy, buf); in show_scaling_setspeed()
942 static ssize_t show_bios_limit(struct cpufreq_policy *policy, char *buf) in show_bios_limit() argument
946 ret = cpufreq_driver->bios_limit(policy->cpu, &limit); in show_bios_limit()
949 return sysfs_emit(buf, "%u\n", policy->cpuinfo.max_freq); in show_bios_limit()
990 struct cpufreq_policy *policy = to_policy(kobj); in show() local
996 guard(cpufreq_policy_read)(policy); in show()
998 if (likely(!policy_is_inactive(policy))) in show()
999 return fattr->show(policy, buf); in show()
1007 struct cpufreq_policy *policy = to_policy(kobj); in store() local
1013 guard(cpufreq_policy_write)(policy); in store()
1015 if (likely(!policy_is_inactive(policy))) in store()
1016 return fattr->store(policy, buf, count); in store()
1023 struct cpufreq_policy *policy = to_policy(kobj); in cpufreq_sysfs_release() local
1025 complete(&policy->kobj_unregister); in cpufreq_sysfs_release()
1039 static void add_cpu_dev_symlink(struct cpufreq_policy *policy, unsigned int cpu, in add_cpu_dev_symlink() argument
1045 if (cpumask_test_and_set_cpu(cpu, policy->real_cpus)) in add_cpu_dev_symlink()
1049 if (sysfs_create_link(&dev->kobj, &policy->kobj, "cpufreq")) in add_cpu_dev_symlink()
1053 static void remove_cpu_dev_symlink(struct cpufreq_policy *policy, int cpu, in remove_cpu_dev_symlink() argument
1058 cpumask_clear_cpu(cpu, policy->real_cpus); in remove_cpu_dev_symlink()
1061 static int cpufreq_add_dev_interface(struct cpufreq_policy *policy) in cpufreq_add_dev_interface() argument
1067 if (policy->freq_table) { in cpufreq_add_dev_interface()
1068 ret = sysfs_create_file(&policy->kobj, in cpufreq_add_dev_interface()
1074 ret = sysfs_create_file(&policy->kobj, in cpufreq_add_dev_interface()
1084 ret = sysfs_create_file(&policy->kobj, &((*drv_attr)->attr)); in cpufreq_add_dev_interface()
1090 ret = sysfs_create_file(&policy->kobj, &cpuinfo_cur_freq.attr); in cpufreq_add_dev_interface()
1095 if (cpufreq_avg_freq_supported(policy)) { in cpufreq_add_dev_interface()
1096 ret = sysfs_create_file(&policy->kobj, &cpuinfo_avg_freq.attr); in cpufreq_add_dev_interface()
1102 ret = sysfs_create_file(&policy->kobj, &bios_limit.attr); in cpufreq_add_dev_interface()
1108 ret = sysfs_create_file(&policy->kobj, &local_boost.attr); in cpufreq_add_dev_interface()
1116 static int cpufreq_init_policy(struct cpufreq_policy *policy) in cpufreq_init_policy() argument
1124 gov = get_governor(policy->last_governor); in cpufreq_init_policy()
1127 gov->name, policy->cpu); in cpufreq_init_policy()
1140 if (policy->last_policy) { in cpufreq_init_policy()
1141 pol = policy->last_policy; in cpufreq_init_policy()
1150 pol = policy->policy; in cpufreq_init_policy()
1157 ret = cpufreq_set_policy(policy, gov, pol); in cpufreq_init_policy()
1164 static int cpufreq_add_policy_cpu(struct cpufreq_policy *policy, unsigned int cpu) in cpufreq_add_policy_cpu() argument
1169 if (cpumask_test_cpu(cpu, policy->cpus)) in cpufreq_add_policy_cpu()
1172 guard(cpufreq_policy_write)(policy); in cpufreq_add_policy_cpu()
1175 cpufreq_stop_governor(policy); in cpufreq_add_policy_cpu()
1177 cpumask_set_cpu(cpu, policy->cpus); in cpufreq_add_policy_cpu()
1180 ret = cpufreq_start_governor(policy); in cpufreq_add_policy_cpu()
1188 void refresh_frequency_limits(struct cpufreq_policy *policy) in refresh_frequency_limits() argument
1190 if (!policy_is_inactive(policy)) { in refresh_frequency_limits()
1191 pr_debug("updating policy for CPU %u\n", policy->cpu); in refresh_frequency_limits()
1193 cpufreq_set_policy(policy, policy->governor, policy->policy); in refresh_frequency_limits()
1200 struct cpufreq_policy *policy = in handle_update() local
1203 pr_debug("handle_update for cpu %u called\n", policy->cpu); in handle_update()
1205 guard(cpufreq_policy_write)(policy); in handle_update()
1207 refresh_frequency_limits(policy); in handle_update()
1213 struct cpufreq_policy *policy = container_of(nb, struct cpufreq_policy, nb_min); in cpufreq_notifier_min() local
1215 schedule_work(&policy->update); in cpufreq_notifier_min()
1222 struct cpufreq_policy *policy = container_of(nb, struct cpufreq_policy, nb_max); in cpufreq_notifier_max() local
1224 schedule_work(&policy->update); in cpufreq_notifier_max()
1228 static void cpufreq_policy_put_kobj(struct cpufreq_policy *policy) in cpufreq_policy_put_kobj() argument
1233 scoped_guard(cpufreq_policy_write, policy) { in cpufreq_policy_put_kobj()
1234 cpufreq_stats_free_table(policy); in cpufreq_policy_put_kobj()
1235 kobj = &policy->kobj; in cpufreq_policy_put_kobj()
1236 cmp = &policy->kobj_unregister; in cpufreq_policy_put_kobj()
1252 struct cpufreq_policy *policy; in cpufreq_policy_alloc() local
1259 policy = kzalloc(sizeof(*policy), GFP_KERNEL); in cpufreq_policy_alloc()
1260 if (!policy) in cpufreq_policy_alloc()
1263 if (!alloc_cpumask_var(&policy->cpus, GFP_KERNEL)) in cpufreq_policy_alloc()
1266 if (!zalloc_cpumask_var(&policy->related_cpus, GFP_KERNEL)) in cpufreq_policy_alloc()
1269 if (!zalloc_cpumask_var(&policy->real_cpus, GFP_KERNEL)) in cpufreq_policy_alloc()
1272 init_completion(&policy->kobj_unregister); in cpufreq_policy_alloc()
1273 ret = kobject_init_and_add(&policy->kobj, &ktype_cpufreq, in cpufreq_policy_alloc()
1282 kobject_put(&policy->kobj); in cpufreq_policy_alloc()
1286 init_rwsem(&policy->rwsem); in cpufreq_policy_alloc()
1288 freq_constraints_init(&policy->constraints); in cpufreq_policy_alloc()
1290 policy->nb_min.notifier_call = cpufreq_notifier_min; in cpufreq_policy_alloc()
1291 policy->nb_max.notifier_call = cpufreq_notifier_max; in cpufreq_policy_alloc()
1293 ret = freq_qos_add_notifier(&policy->constraints, FREQ_QOS_MIN, in cpufreq_policy_alloc()
1294 &policy->nb_min); in cpufreq_policy_alloc()
1301 ret = freq_qos_add_notifier(&policy->constraints, FREQ_QOS_MAX, in cpufreq_policy_alloc()
1302 &policy->nb_max); in cpufreq_policy_alloc()
1309 INIT_LIST_HEAD(&policy->policy_list); in cpufreq_policy_alloc()
1310 spin_lock_init(&policy->transition_lock); in cpufreq_policy_alloc()
1311 init_waitqueue_head(&policy->transition_wait); in cpufreq_policy_alloc()
1312 INIT_WORK(&policy->update, handle_update); in cpufreq_policy_alloc()
1314 return policy; in cpufreq_policy_alloc()
1317 freq_qos_remove_notifier(&policy->constraints, FREQ_QOS_MIN, in cpufreq_policy_alloc()
1318 &policy->nb_min); in cpufreq_policy_alloc()
1320 cpufreq_policy_put_kobj(policy); in cpufreq_policy_alloc()
1322 free_cpumask_var(policy->real_cpus); in cpufreq_policy_alloc()
1324 free_cpumask_var(policy->related_cpus); in cpufreq_policy_alloc()
1326 free_cpumask_var(policy->cpus); in cpufreq_policy_alloc()
1328 kfree(policy); in cpufreq_policy_alloc()
1333 static void cpufreq_policy_free(struct cpufreq_policy *policy) in cpufreq_policy_free() argument
1342 if (unlikely(!policy_is_inactive(policy))) in cpufreq_policy_free()
1347 list_del(&policy->policy_list); in cpufreq_policy_free()
1349 for_each_cpu(cpu, policy->related_cpus) in cpufreq_policy_free()
1353 freq_qos_remove_notifier(&policy->constraints, FREQ_QOS_MAX, in cpufreq_policy_free()
1354 &policy->nb_max); in cpufreq_policy_free()
1355 freq_qos_remove_notifier(&policy->constraints, FREQ_QOS_MIN, in cpufreq_policy_free()
1356 &policy->nb_min); in cpufreq_policy_free()
1359 cancel_work_sync(&policy->update); in cpufreq_policy_free()
1361 if (policy->max_freq_req) { in cpufreq_policy_free()
1368 CPUFREQ_REMOVE_POLICY, policy); in cpufreq_policy_free()
1369 freq_qos_remove_request(policy->max_freq_req); in cpufreq_policy_free()
1372 freq_qos_remove_request(policy->min_freq_req); in cpufreq_policy_free()
1373 kfree(policy->min_freq_req); in cpufreq_policy_free()
1375 cpufreq_policy_put_kobj(policy); in cpufreq_policy_free()
1376 free_cpumask_var(policy->real_cpus); in cpufreq_policy_free()
1377 free_cpumask_var(policy->related_cpus); in cpufreq_policy_free()
1378 free_cpumask_var(policy->cpus); in cpufreq_policy_free()
1379 kfree(policy); in cpufreq_policy_free()
1382 static int cpufreq_policy_online(struct cpufreq_policy *policy, in cpufreq_policy_online() argument
1389 guard(cpufreq_policy_write)(policy); in cpufreq_policy_online()
1391 policy->cpu = cpu; in cpufreq_policy_online()
1392 policy->governor = NULL; in cpufreq_policy_online()
1396 cpumask_copy(policy->cpus, policy->related_cpus); in cpufreq_policy_online()
1398 ret = cpufreq_driver->online(policy); in cpufreq_policy_online()
1405 cpumask_copy(policy->cpus, cpumask_of(cpu)); in cpufreq_policy_online()
1411 ret = cpufreq_driver->init(policy); in cpufreq_policy_online()
1423 ret = cpufreq_table_validate_and_sort(policy); in cpufreq_policy_online()
1428 cpumask_copy(policy->related_cpus, policy->cpus); in cpufreq_policy_online()
1435 cpumask_and(policy->cpus, policy->cpus, cpu_online_mask); in cpufreq_policy_online()
1438 for_each_cpu(j, policy->related_cpus) { in cpufreq_policy_online()
1439 per_cpu(cpufreq_cpu_data, j) = policy; in cpufreq_policy_online()
1440 add_cpu_dev_symlink(policy, j, get_cpu_device(j)); in cpufreq_policy_online()
1443 policy->min_freq_req = kzalloc(2 * sizeof(*policy->min_freq_req), in cpufreq_policy_online()
1445 if (!policy->min_freq_req) { in cpufreq_policy_online()
1450 ret = freq_qos_add_request(&policy->constraints, in cpufreq_policy_online()
1451 policy->min_freq_req, FREQ_QOS_MIN, in cpufreq_policy_online()
1458 kfree(policy->min_freq_req); in cpufreq_policy_online()
1459 policy->min_freq_req = NULL; in cpufreq_policy_online()
1468 policy->max_freq_req = policy->min_freq_req + 1; in cpufreq_policy_online()
1470 ret = freq_qos_add_request(&policy->constraints, in cpufreq_policy_online()
1471 policy->max_freq_req, FREQ_QOS_MAX, in cpufreq_policy_online()
1474 policy->max_freq_req = NULL; in cpufreq_policy_online()
1479 CPUFREQ_CREATE_POLICY, policy); in cpufreq_policy_online()
1481 ret = freq_qos_update_request(policy->max_freq_req, policy->max); 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()
1847 struct cpufreq_policy *policy __free(put_cpufreq_policy) = NULL; in cpufreq_quick_get()
1862 policy = cpufreq_cpu_get(cpu); in cpufreq_quick_get()
1863 if (policy) in cpufreq_quick_get()
1864 return policy->cur; in cpufreq_quick_get()
1878 struct cpufreq_policy *policy __free(put_cpufreq_policy); in cpufreq_quick_get_max()
1880 policy = cpufreq_cpu_get(cpu); in cpufreq_quick_get_max()
1881 if (policy) in cpufreq_quick_get_max()
1882 return policy->max; in cpufreq_quick_get_max()
1896 struct cpufreq_policy *policy __free(put_cpufreq_policy); in cpufreq_get_hw_max_freq()
1898 policy = cpufreq_cpu_get(cpu); in cpufreq_get_hw_max_freq()
1899 if (policy) in cpufreq_get_hw_max_freq()
1900 return policy->cpuinfo.max_freq; in cpufreq_get_hw_max_freq()
1906 static unsigned int __cpufreq_get(struct cpufreq_policy *policy) in __cpufreq_get() argument
1908 if (unlikely(policy_is_inactive(policy))) in __cpufreq_get()
1911 return cpufreq_verify_current_freq(policy, true); in __cpufreq_get()
1922 struct cpufreq_policy *policy __free(put_cpufreq_policy); in cpufreq_get()
1924 policy = cpufreq_cpu_get(cpu); in cpufreq_get()
1925 if (!policy) in cpufreq_get()
1928 guard(cpufreq_policy_read)(policy); in cpufreq_get()
1930 return __cpufreq_get(policy); in cpufreq_get()
1945 int cpufreq_generic_suspend(struct cpufreq_policy *policy) in cpufreq_generic_suspend() argument
1949 if (!policy->suspend_freq) { in cpufreq_generic_suspend()
1955 policy->suspend_freq); in cpufreq_generic_suspend()
1957 ret = __cpufreq_driver_target(policy, policy->suspend_freq, in cpufreq_generic_suspend()
1961 __func__, policy->suspend_freq, ret); in cpufreq_generic_suspend()
1977 struct cpufreq_policy *policy; in cpufreq_suspend() local
1987 for_each_active_policy(policy) { in cpufreq_suspend()
1989 scoped_guard(cpufreq_policy_write, policy) { in cpufreq_suspend()
1990 cpufreq_stop_governor(policy); in cpufreq_suspend()
1994 if (cpufreq_driver->suspend && cpufreq_driver->suspend(policy)) in cpufreq_suspend()
2011 struct cpufreq_policy *policy; in cpufreq_resume() local
2027 for_each_active_policy(policy) { in cpufreq_resume()
2028 if (cpufreq_driver->resume && cpufreq_driver->resume(policy)) { in cpufreq_resume()
2032 scoped_guard(cpufreq_policy_write, policy) { in cpufreq_resume()
2033 ret = cpufreq_start_governor(policy); in cpufreq_resume()
2038 __func__, policy->cpu); in cpufreq_resume()
2203 unsigned int cpufreq_driver_fast_switch(struct cpufreq_policy *policy, in cpufreq_driver_fast_switch() argument
2209 target_freq = clamp_val(target_freq, policy->min, policy->max); in cpufreq_driver_fast_switch()
2210 freq = cpufreq_driver->fast_switch(policy, target_freq); in cpufreq_driver_fast_switch()
2215 policy->cur = freq; in cpufreq_driver_fast_switch()
2216 arch_set_freq_scale(policy->related_cpus, freq, in cpufreq_driver_fast_switch()
2217 arch_scale_freq_ref(policy->cpu)); in cpufreq_driver_fast_switch()
2218 cpufreq_stats_record_transition(policy, freq); in cpufreq_driver_fast_switch()
2221 for_each_cpu(cpu, policy->cpus) in cpufreq_driver_fast_switch()
2270 static int __target_intermediate(struct cpufreq_policy *policy, in __target_intermediate() argument
2275 freqs->new = cpufreq_driver->get_intermediate(policy, index); in __target_intermediate()
2282 __func__, policy->cpu, freqs->old, freqs->new); in __target_intermediate()
2284 cpufreq_freq_transition_begin(policy, freqs); in __target_intermediate()
2285 ret = cpufreq_driver->target_intermediate(policy, index); in __target_intermediate()
2286 cpufreq_freq_transition_end(policy, freqs, ret); in __target_intermediate()
2295 static int __target_index(struct cpufreq_policy *policy, int index) in __target_index() argument
2297 struct cpufreq_freqs freqs = {.old = policy->cur, .flags = 0}; in __target_index()
2299 unsigned int newfreq = policy->freq_table[index].frequency; in __target_index()
2303 if (newfreq == policy->cur) in __target_index()
2307 restore_freq = policy->cur; in __target_index()
2313 retval = __target_intermediate(policy, &freqs, index); in __target_index()
2325 __func__, policy->cpu, freqs.old, freqs.new); in __target_index()
2327 cpufreq_freq_transition_begin(policy, &freqs); in __target_index()
2330 retval = cpufreq_driver->target_index(policy, index); in __target_index()
2336 cpufreq_freq_transition_end(policy, &freqs, retval); in __target_index()
2347 cpufreq_freq_transition_begin(policy, &freqs); in __target_index()
2348 cpufreq_freq_transition_end(policy, &freqs, 0); in __target_index()
2355 int __cpufreq_driver_target(struct cpufreq_policy *policy, in __cpufreq_driver_target() argument
2364 target_freq = __resolve_freq(policy, target_freq, policy->min, in __cpufreq_driver_target()
2365 policy->max, relation); in __cpufreq_driver_target()
2368 policy->cpu, target_freq, relation, old_target_freq); in __cpufreq_driver_target()
2376 if (target_freq == policy->cur && in __cpufreq_driver_target()
2385 if (!policy->efficiencies_available) in __cpufreq_driver_target()
2388 return cpufreq_driver->target(policy, target_freq, relation); in __cpufreq_driver_target()
2394 return __target_index(policy, policy->cached_resolved_idx); in __cpufreq_driver_target()
2398 int cpufreq_driver_target(struct cpufreq_policy *policy, in cpufreq_driver_target() argument
2402 guard(cpufreq_policy_write)(policy); in cpufreq_driver_target()
2404 return __cpufreq_driver_target(policy, target_freq, relation); in cpufreq_driver_target()
2413 static int cpufreq_init_governor(struct cpufreq_policy *policy) in cpufreq_init_governor() argument
2424 if (!policy->governor) in cpufreq_init_governor()
2428 if (policy->governor->flags & CPUFREQ_GOV_DYNAMIC_SWITCHING && in cpufreq_init_governor()
2434 policy->governor->name, gov->name); in cpufreq_init_governor()
2435 policy->governor = gov; in cpufreq_init_governor()
2441 if (!try_module_get(policy->governor->owner)) in cpufreq_init_governor()
2444 pr_debug("%s: for CPU %u\n", __func__, policy->cpu); in cpufreq_init_governor()
2446 if (policy->governor->init) { in cpufreq_init_governor()
2447 ret = policy->governor->init(policy); in cpufreq_init_governor()
2449 module_put(policy->governor->owner); in cpufreq_init_governor()
2454 policy->strict_target = !!(policy->governor->flags & CPUFREQ_GOV_STRICT_TARGET); in cpufreq_init_governor()
2459 static void cpufreq_exit_governor(struct cpufreq_policy *policy) in cpufreq_exit_governor() argument
2461 if (cpufreq_suspended || !policy->governor) in cpufreq_exit_governor()
2464 pr_debug("%s: for CPU %u\n", __func__, policy->cpu); in cpufreq_exit_governor()
2466 if (policy->governor->exit) in cpufreq_exit_governor()
2467 policy->governor->exit(policy); in cpufreq_exit_governor()
2469 module_put(policy->governor->owner); in cpufreq_exit_governor()
2472 int cpufreq_start_governor(struct cpufreq_policy *policy) in cpufreq_start_governor() argument
2479 if (!policy->governor) in cpufreq_start_governor()
2482 pr_debug("%s: for CPU %u\n", __func__, policy->cpu); in cpufreq_start_governor()
2484 cpufreq_verify_current_freq(policy, false); in cpufreq_start_governor()
2486 if (policy->governor->start) { in cpufreq_start_governor()
2487 ret = policy->governor->start(policy); in cpufreq_start_governor()
2492 if (policy->governor->limits) in cpufreq_start_governor()
2493 policy->governor->limits(policy); in cpufreq_start_governor()
2498 void cpufreq_stop_governor(struct cpufreq_policy *policy) in cpufreq_stop_governor() argument
2500 if (cpufreq_suspended || !policy->governor) in cpufreq_stop_governor()
2503 pr_debug("%s: for CPU %u\n", __func__, policy->cpu); in cpufreq_stop_governor()
2505 if (policy->governor->stop) in cpufreq_stop_governor()
2506 policy->governor->stop(policy); in cpufreq_stop_governor()
2509 static void cpufreq_governor_limits(struct cpufreq_policy *policy) in cpufreq_governor_limits() argument
2511 if (cpufreq_suspended || !policy->governor) in cpufreq_governor_limits()
2514 pr_debug("%s: for CPU %u\n", __func__, policy->cpu); in cpufreq_governor_limits()
2516 if (policy->governor->limits) in cpufreq_governor_limits()
2517 policy->governor->limits(policy); in cpufreq_governor_limits()
2545 struct cpufreq_policy *policy; in cpufreq_unregister_governor() local
2556 for_each_inactive_policy(policy) { in cpufreq_unregister_governor()
2557 if (!strcmp(policy->last_governor, governor->name)) { in cpufreq_unregister_governor()
2558 policy->governor = NULL; in cpufreq_unregister_governor()
2559 strcpy(policy->last_governor, "\0"); in cpufreq_unregister_governor()
2583 static void cpufreq_update_pressure(struct cpufreq_policy *policy) in cpufreq_update_pressure() argument
2589 cpu = cpumask_first(policy->related_cpus); in cpufreq_update_pressure()
2591 capped_freq = policy->max; in cpufreq_update_pressure()
2605 for_each_cpu(cpu, policy->related_cpus) in cpufreq_update_pressure()
2624 static int cpufreq_set_policy(struct cpufreq_policy *policy, in cpufreq_set_policy() argument
2632 memcpy(&new_data.cpuinfo, &policy->cpuinfo, sizeof(policy->cpuinfo)); in cpufreq_set_policy()
2633 new_data.freq_table = policy->freq_table; in cpufreq_set_policy()
2634 new_data.cpu = policy->cpu; in cpufreq_set_policy()
2639 new_data.min = freq_qos_read_value(&policy->constraints, FREQ_QOS_MIN); in cpufreq_set_policy()
2640 new_data.max = freq_qos_read_value(&policy->constraints, FREQ_QOS_MAX); in cpufreq_set_policy()
2662 WRITE_ONCE(policy->max, __resolve_freq(policy, new_data.max, in cpufreq_set_policy()
2665 new_data.min = __resolve_freq(policy, new_data.min, new_data.min, in cpufreq_set_policy()
2667 WRITE_ONCE(policy->min, new_data.min > policy->max ? policy->max : new_data.min); in cpufreq_set_policy()
2669 trace_cpu_frequency_limits(policy); in cpufreq_set_policy()
2671 cpufreq_update_pressure(policy); in cpufreq_set_policy()
2673 policy->cached_target_freq = UINT_MAX; in cpufreq_set_policy()
2676 policy->min, policy->max); in cpufreq_set_policy()
2679 policy->policy = new_pol; in cpufreq_set_policy()
2681 return cpufreq_driver->setpolicy(policy); in cpufreq_set_policy()
2684 if (new_gov == policy->governor) { in cpufreq_set_policy()
2686 cpufreq_governor_limits(policy); in cpufreq_set_policy()
2693 old_gov = policy->governor; in cpufreq_set_policy()
2696 cpufreq_stop_governor(policy); in cpufreq_set_policy()
2697 cpufreq_exit_governor(policy); in cpufreq_set_policy()
2701 policy->governor = new_gov; in cpufreq_set_policy()
2702 ret = cpufreq_init_governor(policy); in cpufreq_set_policy()
2704 ret = cpufreq_start_governor(policy); in cpufreq_set_policy()
2709 cpufreq_exit_governor(policy); in cpufreq_set_policy()
2713 pr_debug("starting governor %s failed\n", policy->governor->name); in cpufreq_set_policy()
2715 policy->governor = old_gov; in cpufreq_set_policy()
2716 if (cpufreq_init_governor(policy)) { in cpufreq_set_policy()
2717 policy->governor = NULL; in cpufreq_set_policy()
2718 } else if (cpufreq_start_governor(policy)) { in cpufreq_set_policy()
2719 cpufreq_exit_governor(policy); in cpufreq_set_policy()
2720 policy->governor = NULL; in cpufreq_set_policy()
2727 static void cpufreq_policy_refresh(struct cpufreq_policy *policy) in cpufreq_policy_refresh() argument
2729 guard(cpufreq_policy_write)(policy); in cpufreq_policy_refresh()
2736 (cpufreq_suspended || WARN_ON(!cpufreq_verify_current_freq(policy, false)))) in cpufreq_policy_refresh()
2739 refresh_frequency_limits(policy); in cpufreq_policy_refresh()
2753 struct cpufreq_policy *policy __free(put_cpufreq_policy); in cpufreq_update_policy()
2755 policy = cpufreq_cpu_get(cpu); in cpufreq_update_policy()
2756 if (!policy) in cpufreq_update_policy()
2759 cpufreq_policy_refresh(policy); in cpufreq_update_policy()
2772 struct cpufreq_policy *policy __free(put_cpufreq_policy); in cpufreq_update_limits()
2774 policy = cpufreq_cpu_get(cpu); in cpufreq_update_limits()
2775 if (!policy) in cpufreq_update_limits()
2779 cpufreq_driver->update_limits(policy); in cpufreq_update_limits()
2781 cpufreq_policy_refresh(policy); in cpufreq_update_limits()
2788 int cpufreq_boost_set_sw(struct cpufreq_policy *policy, int state) in cpufreq_boost_set_sw() argument
2792 if (!policy->freq_table) in cpufreq_boost_set_sw()
2795 ret = cpufreq_frequency_table_cpuinfo(policy, policy->freq_table); in cpufreq_boost_set_sw()
2801 ret = freq_qos_update_request(policy->max_freq_req, policy->max); in cpufreq_boost_set_sw()
2811 struct cpufreq_policy *policy; in cpufreq_boost_trigger_state() local
2825 for_each_active_policy(policy) { in cpufreq_boost_trigger_state()
2826 if (!policy->boost_supported) in cpufreq_boost_trigger_state()
2829 ret = policy_set_boost(policy, state); in cpufreq_boost_trigger_state()
3059 struct cpufreq_policy *policy __free(put_cpufreq_policy); in cpufreq_policy_is_good_for_eas()
3061 policy = cpufreq_cpu_get(cpu); in cpufreq_policy_is_good_for_eas()
3062 if (!policy) { in cpufreq_policy_is_good_for_eas()
3067 return sugov_is_governor(policy); in cpufreq_policy_is_good_for_eas()