Loading drivers/thermal/msm_thermal.c +58 −9 Original line number Diff line number Diff line Loading @@ -45,6 +45,7 @@ #include <linux/notifier.h> #include <linux/reboot.h> #include <soc/qcom/msm-core.h> #include <linux/cpumask.h> #define CREATE_TRACE_POINTS #define TRACE_MSM_THERMAL Loading @@ -60,6 +61,7 @@ #define SENSOR_SCALING_FACTOR 1 #define MSM_THERMAL_NAME "msm_thermal" #define MSM_TSENS_PRINT "log_tsens_temperature" #define CPU_BUF_SIZE 64 #define THERM_CREATE_DEBUGFS_DIR(_node, _name, _parent, _ret) \ do { \ Loading @@ -85,6 +87,7 @@ static struct msm_thermal_data msm_thermal_info; static struct delayed_work check_temp_work; static bool core_control_enabled; static uint32_t cpus_offlined; static cpumask_var_t cpus_previously_online; static DEFINE_MUTEX(core_control_mutex); static struct kobject *cc_kobj; static struct kobject *mx_kobj; Loading Loading @@ -419,6 +422,18 @@ uint32_t get_core_max_freq(uint32_t cpu) return max_freq; } static void cpus_previously_online_update(void) { char buf[CPU_BUF_SIZE]; get_online_cpus(); cpumask_or(cpus_previously_online, cpus_previously_online, cpu_online_mask); put_online_cpus(); cpulist_scnprintf(buf, sizeof(buf), cpus_previously_online); pr_debug("%s\n", buf); } uint32_t get_core_min_freq(uint32_t cpu) { int i; Loading Loading @@ -844,7 +859,8 @@ static void update_cpu_topology(struct device *dev) static int __ref init_cluster_freq_table(void) { uint32_t _cluster = 0, _cpu = 0, table_len = 0, idx = 0; int ret = 0; int ret = 0, cpu_set; char buf[CPU_BUF_SIZE]; struct cluster_info *cluster_ptr = NULL; struct cpufreq_policy *policy = NULL; struct cpufreq_frequency_table *freq_table_ptr = NULL; Loading Loading @@ -876,10 +892,22 @@ static int __ref init_cluster_freq_table(void) cluster_ptr->cluster_id, _cpu); pending_cpu_freq = _cpu; if (!cpu_online(_cpu)) { cpu_set = cpumask_test_cpu(_cpu, cpus_previously_online); #ifdef CONFIG_SMP cpu_up(_cpu); cpu_down(_cpu); #endif /* Remove prev online bit if we are first to put it online */ if (!cpu_set) { cpumask_clear_cpu(_cpu, cpus_previously_online); cpumask_scnprintf(buf, sizeof(buf), cpus_previously_online); pr_debug("Reset prev online to %s\n", buf); } } freq_table_ptr = pending_freq_table_ptr; } Loading Loading @@ -2090,6 +2118,7 @@ static void __ref do_core_control(long temp) continue; pr_info("Set Offline: CPU%d Temp: %ld\n", i, temp); if (cpu_online(i)) { trace_thermal_pre_core_offline(i); ret = cpu_down(i); if (ret) Loading @@ -2097,6 +2126,7 @@ static void __ref do_core_control(long temp) ret, i); trace_thermal_post_core_offline(i, cpumask_test_cpu(i, cpu_online_mask)); } cpus_offlined |= BIT(i); break; } Loading @@ -2115,6 +2145,10 @@ static void __ref do_core_control(long temp) */ if (cpu_online(i)) continue; /* If this core wasn't previously online don't put it online */ if (!(cpumask_test_cpu(i, cpus_previously_online))) continue; trace_thermal_pre_core_online(i); ret = cpu_up(i); if (ret) Loading Loading @@ -2156,6 +2190,10 @@ static int __ref update_offline_cores(int val) } else if (online_core && (previous_cpus_offlined & BIT(cpu))) { if (cpu_online(cpu)) continue; /* If this core wasn't previously online don't put it online */ if (!(cpumask_test_cpu(cpu, cpus_previously_online))) continue; trace_thermal_pre_core_online(cpu); ret = cpu_up(cpu); if (ret && ret == notifier_to_errno(NOTIFY_BAD)) Loading Loading @@ -2626,6 +2664,9 @@ static int __ref msm_thermal_cpu_callback(struct notifier_block *nfb, uint32_t cpu = (uintptr_t)hcpu; if (action == CPU_UP_PREPARE || action == CPU_UP_PREPARE_FROZEN) { if (!cpumask_test_and_set_cpu(cpu, cpus_previously_online)) pr_debug("Total prev cores online tracked %u\n", cpumask_weight(cpus_previously_online)); if (core_control_enabled && (msm_thermal_info.core_control_mask & BIT(cpu)) && (cpus_offlined & BIT(cpu))) { Loading @@ -2633,6 +2674,11 @@ static int __ref msm_thermal_cpu_callback(struct notifier_block *nfb, cpu); return NOTIFY_BAD; } } else if (action == CPU_DOWN_PREPARE || action == CPU_DOWN_PREPARE_FROZEN) { if (!cpumask_test_and_set_cpu(cpu, cpus_previously_online)) pr_debug("Total prev cores online tracked %u\n", cpumask_weight(cpus_previously_online)); } pr_debug("voting for CPU%d to be online\n", cpu); Loading Loading @@ -3744,6 +3790,7 @@ static ssize_t __ref store_cc_enabled(struct kobject *kobj, core_control_enabled = !!val; if (core_control_enabled) { pr_info("Core control enabled\n"); cpus_previously_online_update(); register_cpu_notifier(&msm_thermal_cpu_notifier); /* * Re-evaluate thermal core condition, update current status Loading Loading @@ -4041,8 +4088,10 @@ int msm_thermal_init(struct msm_thermal_data *pdata) INIT_DELAYED_WORK(&check_temp_work, check_temp); schedule_delayed_work(&check_temp_work, 0); if (num_possible_cpus() > 1) if (num_possible_cpus() > 1) { cpus_previously_online_update(); register_cpu_notifier(&msm_thermal_cpu_notifier); } return ret; } Loading Loading
drivers/thermal/msm_thermal.c +58 −9 Original line number Diff line number Diff line Loading @@ -45,6 +45,7 @@ #include <linux/notifier.h> #include <linux/reboot.h> #include <soc/qcom/msm-core.h> #include <linux/cpumask.h> #define CREATE_TRACE_POINTS #define TRACE_MSM_THERMAL Loading @@ -60,6 +61,7 @@ #define SENSOR_SCALING_FACTOR 1 #define MSM_THERMAL_NAME "msm_thermal" #define MSM_TSENS_PRINT "log_tsens_temperature" #define CPU_BUF_SIZE 64 #define THERM_CREATE_DEBUGFS_DIR(_node, _name, _parent, _ret) \ do { \ Loading @@ -85,6 +87,7 @@ static struct msm_thermal_data msm_thermal_info; static struct delayed_work check_temp_work; static bool core_control_enabled; static uint32_t cpus_offlined; static cpumask_var_t cpus_previously_online; static DEFINE_MUTEX(core_control_mutex); static struct kobject *cc_kobj; static struct kobject *mx_kobj; Loading Loading @@ -419,6 +422,18 @@ uint32_t get_core_max_freq(uint32_t cpu) return max_freq; } static void cpus_previously_online_update(void) { char buf[CPU_BUF_SIZE]; get_online_cpus(); cpumask_or(cpus_previously_online, cpus_previously_online, cpu_online_mask); put_online_cpus(); cpulist_scnprintf(buf, sizeof(buf), cpus_previously_online); pr_debug("%s\n", buf); } uint32_t get_core_min_freq(uint32_t cpu) { int i; Loading Loading @@ -844,7 +859,8 @@ static void update_cpu_topology(struct device *dev) static int __ref init_cluster_freq_table(void) { uint32_t _cluster = 0, _cpu = 0, table_len = 0, idx = 0; int ret = 0; int ret = 0, cpu_set; char buf[CPU_BUF_SIZE]; struct cluster_info *cluster_ptr = NULL; struct cpufreq_policy *policy = NULL; struct cpufreq_frequency_table *freq_table_ptr = NULL; Loading Loading @@ -876,10 +892,22 @@ static int __ref init_cluster_freq_table(void) cluster_ptr->cluster_id, _cpu); pending_cpu_freq = _cpu; if (!cpu_online(_cpu)) { cpu_set = cpumask_test_cpu(_cpu, cpus_previously_online); #ifdef CONFIG_SMP cpu_up(_cpu); cpu_down(_cpu); #endif /* Remove prev online bit if we are first to put it online */ if (!cpu_set) { cpumask_clear_cpu(_cpu, cpus_previously_online); cpumask_scnprintf(buf, sizeof(buf), cpus_previously_online); pr_debug("Reset prev online to %s\n", buf); } } freq_table_ptr = pending_freq_table_ptr; } Loading Loading @@ -2090,6 +2118,7 @@ static void __ref do_core_control(long temp) continue; pr_info("Set Offline: CPU%d Temp: %ld\n", i, temp); if (cpu_online(i)) { trace_thermal_pre_core_offline(i); ret = cpu_down(i); if (ret) Loading @@ -2097,6 +2126,7 @@ static void __ref do_core_control(long temp) ret, i); trace_thermal_post_core_offline(i, cpumask_test_cpu(i, cpu_online_mask)); } cpus_offlined |= BIT(i); break; } Loading @@ -2115,6 +2145,10 @@ static void __ref do_core_control(long temp) */ if (cpu_online(i)) continue; /* If this core wasn't previously online don't put it online */ if (!(cpumask_test_cpu(i, cpus_previously_online))) continue; trace_thermal_pre_core_online(i); ret = cpu_up(i); if (ret) Loading Loading @@ -2156,6 +2190,10 @@ static int __ref update_offline_cores(int val) } else if (online_core && (previous_cpus_offlined & BIT(cpu))) { if (cpu_online(cpu)) continue; /* If this core wasn't previously online don't put it online */ if (!(cpumask_test_cpu(cpu, cpus_previously_online))) continue; trace_thermal_pre_core_online(cpu); ret = cpu_up(cpu); if (ret && ret == notifier_to_errno(NOTIFY_BAD)) Loading Loading @@ -2626,6 +2664,9 @@ static int __ref msm_thermal_cpu_callback(struct notifier_block *nfb, uint32_t cpu = (uintptr_t)hcpu; if (action == CPU_UP_PREPARE || action == CPU_UP_PREPARE_FROZEN) { if (!cpumask_test_and_set_cpu(cpu, cpus_previously_online)) pr_debug("Total prev cores online tracked %u\n", cpumask_weight(cpus_previously_online)); if (core_control_enabled && (msm_thermal_info.core_control_mask & BIT(cpu)) && (cpus_offlined & BIT(cpu))) { Loading @@ -2633,6 +2674,11 @@ static int __ref msm_thermal_cpu_callback(struct notifier_block *nfb, cpu); return NOTIFY_BAD; } } else if (action == CPU_DOWN_PREPARE || action == CPU_DOWN_PREPARE_FROZEN) { if (!cpumask_test_and_set_cpu(cpu, cpus_previously_online)) pr_debug("Total prev cores online tracked %u\n", cpumask_weight(cpus_previously_online)); } pr_debug("voting for CPU%d to be online\n", cpu); Loading Loading @@ -3744,6 +3790,7 @@ static ssize_t __ref store_cc_enabled(struct kobject *kobj, core_control_enabled = !!val; if (core_control_enabled) { pr_info("Core control enabled\n"); cpus_previously_online_update(); register_cpu_notifier(&msm_thermal_cpu_notifier); /* * Re-evaluate thermal core condition, update current status Loading Loading @@ -4041,8 +4088,10 @@ int msm_thermal_init(struct msm_thermal_data *pdata) INIT_DELAYED_WORK(&check_temp_work, check_temp); schedule_delayed_work(&check_temp_work, 0); if (num_possible_cpus() > 1) if (num_possible_cpus() > 1) { cpus_previously_online_update(); register_cpu_notifier(&msm_thermal_cpu_notifier); } return ret; } Loading