Loading drivers/opp/core.c +1 −1 Original line number Diff line number Diff line Loading @@ -760,7 +760,7 @@ int dev_pm_opp_set_rate(struct device *dev, unsigned long target_freq) old_freq, freq); /* Scaling up? Configure required OPPs before frequency */ if (freq > old_freq) { if (freq >= old_freq) { ret = _set_required_opps(dev, opp_table, opp); if (ret) goto put_opp; Loading drivers/opp/of.c +14 −2 Original line number Diff line number Diff line Loading @@ -173,7 +173,7 @@ static void _opp_table_alloc_required_tables(struct opp_table *opp_table, struct opp_table **required_opp_tables; struct device **genpd_virt_devs = NULL; struct device_node *required_np, *np; int count, i; int count, count_pd, i; /* Traversing the first OPP node is all we need */ np = of_get_next_available_child(opp_np, NULL); Loading @@ -186,7 +186,19 @@ static void _opp_table_alloc_required_tables(struct opp_table *opp_table, if (!count) goto put_np; if (count > 1) { /* * Check the number of power-domains to know if we need to deal * with virtual devices. In some cases we have devices with multiple * power domains but with only one of them being scalable, hence * 'count' could be 1, but we still have to deal with multiple genpds * and virtual devices. */ count_pd = of_count_phandle_with_args(dev->of_node, "power-domains", "#power-domain-cells"); if (!count_pd) goto put_np; if (count_pd > 1) { genpd_virt_devs = kcalloc(count, sizeof(*genpd_virt_devs), GFP_KERNEL); if (!genpd_virt_devs) Loading tools/power/cpupower/lib/cpufreq.c +11 −8 Original line number Diff line number Diff line Loading @@ -333,17 +333,20 @@ void cpufreq_put_available_governors(struct cpufreq_available_governors *any) } struct cpufreq_available_frequencies *cpufreq_get_available_frequencies(unsigned int cpu) struct cpufreq_frequencies *cpufreq_get_frequencies(const char *type, unsigned int cpu) { struct cpufreq_available_frequencies *first = NULL; struct cpufreq_available_frequencies *current = NULL; struct cpufreq_frequencies *first = NULL; struct cpufreq_frequencies *current = NULL; char one_value[SYSFS_PATH_MAX]; char linebuf[MAX_LINE_LEN]; char fname[MAX_LINE_LEN]; unsigned int pos, i; unsigned int len; len = sysfs_cpufreq_read_file(cpu, "scaling_available_frequencies", snprintf(fname, MAX_LINE_LEN, "scaling_%s_frequencies", type); len = sysfs_cpufreq_read_file(cpu, fname, linebuf, sizeof(linebuf)); if (len == 0) return NULL; Loading Loading @@ -389,9 +392,9 @@ struct cpufreq_available_frequencies return NULL; } void cpufreq_put_available_frequencies(struct cpufreq_available_frequencies *any) { struct cpufreq_available_frequencies *tmp, *next; void cpufreq_put_frequencies(struct cpufreq_frequencies *any) { struct cpufreq_frequencies *tmp, *next; if (!any) return; Loading tools/power/cpupower/lib/cpufreq.h +8 −8 Original line number Diff line number Diff line Loading @@ -28,10 +28,10 @@ struct cpufreq_available_governors { struct cpufreq_available_governors *first; }; struct cpufreq_available_frequencies { struct cpufreq_frequencies { unsigned long frequency; struct cpufreq_available_frequencies *next; struct cpufreq_available_frequencies *first; struct cpufreq_frequencies *next; struct cpufreq_frequencies *first; }; Loading Loading @@ -129,14 +129,14 @@ void cpufreq_put_available_governors( * * Only present on _some_ ->target() cpufreq drivers. For information purposes * only. Please free allocated memory by calling * cpufreq_put_available_frequencies after use. * cpufreq_put_frequencies after use. */ struct cpufreq_available_frequencies *cpufreq_get_available_frequencies(unsigned int cpu); struct cpufreq_frequencies *cpufreq_get_frequencies(const char *type, unsigned int cpu); void cpufreq_put_available_frequencies( struct cpufreq_available_frequencies *first); void cpufreq_put_frequencies( struct cpufreq_frequencies *first); /* determine affected CPUs Loading tools/power/cpupower/utils/cpufreq-info.c +31 −11 Original line number Diff line number Diff line Loading @@ -161,19 +161,12 @@ static void print_duration(unsigned long duration) return; } /* --boost / -b */ static int get_boost_mode(unsigned int cpu) static int get_boost_mode_x86(unsigned int cpu) { int support, active, b_states = 0, ret, pstate_no, i; /* ToDo: Make this more global */ unsigned long pstates[MAX_HW_PSTATES] = {0,}; if (cpupower_cpu_info.vendor != X86_VENDOR_AMD && cpupower_cpu_info.vendor != X86_VENDOR_HYGON && cpupower_cpu_info.vendor != X86_VENDOR_INTEL) return 0; ret = cpufreq_has_boost_support(cpu, &support, &active, &b_states); if (ret) { printf(_("Error while evaluating Boost Capabilities" Loading Loading @@ -248,6 +241,33 @@ static int get_boost_mode(unsigned int cpu) return 0; } /* --boost / -b */ static int get_boost_mode(unsigned int cpu) { struct cpufreq_frequencies *freqs; if (cpupower_cpu_info.vendor == X86_VENDOR_AMD || cpupower_cpu_info.vendor == X86_VENDOR_HYGON || cpupower_cpu_info.vendor == X86_VENDOR_INTEL) return get_boost_mode_x86(cpu); freqs = cpufreq_get_frequencies("boost", cpu); if (freqs) { printf(_(" boost frequency steps: ")); while (freqs->next) { print_speed(freqs->frequency); printf(", "); freqs = freqs->next; } print_speed(freqs->frequency); printf("\n"); cpufreq_put_frequencies(freqs); } return 0; } /* --freq / -f */ static int get_freq_kernel(unsigned int cpu, unsigned int human) Loading Loading @@ -456,7 +476,7 @@ static int get_latency(unsigned int cpu, unsigned int human) static void debug_output_one(unsigned int cpu) { struct cpufreq_available_frequencies *freqs; struct cpufreq_frequencies *freqs; get_driver(cpu); get_related_cpus(cpu); Loading @@ -464,7 +484,7 @@ static void debug_output_one(unsigned int cpu) get_latency(cpu, 1); get_hardware_limits(cpu, 1); freqs = cpufreq_get_available_frequencies(cpu); freqs = cpufreq_get_frequencies("available", cpu); if (freqs) { printf(_(" available frequency steps: ")); while (freqs->next) { Loading @@ -474,7 +494,7 @@ static void debug_output_one(unsigned int cpu) } print_speed(freqs->frequency); printf("\n"); cpufreq_put_available_frequencies(freqs); cpufreq_put_frequencies(freqs); } get_available_governors(cpu); Loading Loading
drivers/opp/core.c +1 −1 Original line number Diff line number Diff line Loading @@ -760,7 +760,7 @@ int dev_pm_opp_set_rate(struct device *dev, unsigned long target_freq) old_freq, freq); /* Scaling up? Configure required OPPs before frequency */ if (freq > old_freq) { if (freq >= old_freq) { ret = _set_required_opps(dev, opp_table, opp); if (ret) goto put_opp; Loading
drivers/opp/of.c +14 −2 Original line number Diff line number Diff line Loading @@ -173,7 +173,7 @@ static void _opp_table_alloc_required_tables(struct opp_table *opp_table, struct opp_table **required_opp_tables; struct device **genpd_virt_devs = NULL; struct device_node *required_np, *np; int count, i; int count, count_pd, i; /* Traversing the first OPP node is all we need */ np = of_get_next_available_child(opp_np, NULL); Loading @@ -186,7 +186,19 @@ static void _opp_table_alloc_required_tables(struct opp_table *opp_table, if (!count) goto put_np; if (count > 1) { /* * Check the number of power-domains to know if we need to deal * with virtual devices. In some cases we have devices with multiple * power domains but with only one of them being scalable, hence * 'count' could be 1, but we still have to deal with multiple genpds * and virtual devices. */ count_pd = of_count_phandle_with_args(dev->of_node, "power-domains", "#power-domain-cells"); if (!count_pd) goto put_np; if (count_pd > 1) { genpd_virt_devs = kcalloc(count, sizeof(*genpd_virt_devs), GFP_KERNEL); if (!genpd_virt_devs) Loading
tools/power/cpupower/lib/cpufreq.c +11 −8 Original line number Diff line number Diff line Loading @@ -333,17 +333,20 @@ void cpufreq_put_available_governors(struct cpufreq_available_governors *any) } struct cpufreq_available_frequencies *cpufreq_get_available_frequencies(unsigned int cpu) struct cpufreq_frequencies *cpufreq_get_frequencies(const char *type, unsigned int cpu) { struct cpufreq_available_frequencies *first = NULL; struct cpufreq_available_frequencies *current = NULL; struct cpufreq_frequencies *first = NULL; struct cpufreq_frequencies *current = NULL; char one_value[SYSFS_PATH_MAX]; char linebuf[MAX_LINE_LEN]; char fname[MAX_LINE_LEN]; unsigned int pos, i; unsigned int len; len = sysfs_cpufreq_read_file(cpu, "scaling_available_frequencies", snprintf(fname, MAX_LINE_LEN, "scaling_%s_frequencies", type); len = sysfs_cpufreq_read_file(cpu, fname, linebuf, sizeof(linebuf)); if (len == 0) return NULL; Loading Loading @@ -389,9 +392,9 @@ struct cpufreq_available_frequencies return NULL; } void cpufreq_put_available_frequencies(struct cpufreq_available_frequencies *any) { struct cpufreq_available_frequencies *tmp, *next; void cpufreq_put_frequencies(struct cpufreq_frequencies *any) { struct cpufreq_frequencies *tmp, *next; if (!any) return; Loading
tools/power/cpupower/lib/cpufreq.h +8 −8 Original line number Diff line number Diff line Loading @@ -28,10 +28,10 @@ struct cpufreq_available_governors { struct cpufreq_available_governors *first; }; struct cpufreq_available_frequencies { struct cpufreq_frequencies { unsigned long frequency; struct cpufreq_available_frequencies *next; struct cpufreq_available_frequencies *first; struct cpufreq_frequencies *next; struct cpufreq_frequencies *first; }; Loading Loading @@ -129,14 +129,14 @@ void cpufreq_put_available_governors( * * Only present on _some_ ->target() cpufreq drivers. For information purposes * only. Please free allocated memory by calling * cpufreq_put_available_frequencies after use. * cpufreq_put_frequencies after use. */ struct cpufreq_available_frequencies *cpufreq_get_available_frequencies(unsigned int cpu); struct cpufreq_frequencies *cpufreq_get_frequencies(const char *type, unsigned int cpu); void cpufreq_put_available_frequencies( struct cpufreq_available_frequencies *first); void cpufreq_put_frequencies( struct cpufreq_frequencies *first); /* determine affected CPUs Loading
tools/power/cpupower/utils/cpufreq-info.c +31 −11 Original line number Diff line number Diff line Loading @@ -161,19 +161,12 @@ static void print_duration(unsigned long duration) return; } /* --boost / -b */ static int get_boost_mode(unsigned int cpu) static int get_boost_mode_x86(unsigned int cpu) { int support, active, b_states = 0, ret, pstate_no, i; /* ToDo: Make this more global */ unsigned long pstates[MAX_HW_PSTATES] = {0,}; if (cpupower_cpu_info.vendor != X86_VENDOR_AMD && cpupower_cpu_info.vendor != X86_VENDOR_HYGON && cpupower_cpu_info.vendor != X86_VENDOR_INTEL) return 0; ret = cpufreq_has_boost_support(cpu, &support, &active, &b_states); if (ret) { printf(_("Error while evaluating Boost Capabilities" Loading Loading @@ -248,6 +241,33 @@ static int get_boost_mode(unsigned int cpu) return 0; } /* --boost / -b */ static int get_boost_mode(unsigned int cpu) { struct cpufreq_frequencies *freqs; if (cpupower_cpu_info.vendor == X86_VENDOR_AMD || cpupower_cpu_info.vendor == X86_VENDOR_HYGON || cpupower_cpu_info.vendor == X86_VENDOR_INTEL) return get_boost_mode_x86(cpu); freqs = cpufreq_get_frequencies("boost", cpu); if (freqs) { printf(_(" boost frequency steps: ")); while (freqs->next) { print_speed(freqs->frequency); printf(", "); freqs = freqs->next; } print_speed(freqs->frequency); printf("\n"); cpufreq_put_frequencies(freqs); } return 0; } /* --freq / -f */ static int get_freq_kernel(unsigned int cpu, unsigned int human) Loading Loading @@ -456,7 +476,7 @@ static int get_latency(unsigned int cpu, unsigned int human) static void debug_output_one(unsigned int cpu) { struct cpufreq_available_frequencies *freqs; struct cpufreq_frequencies *freqs; get_driver(cpu); get_related_cpus(cpu); Loading @@ -464,7 +484,7 @@ static void debug_output_one(unsigned int cpu) get_latency(cpu, 1); get_hardware_limits(cpu, 1); freqs = cpufreq_get_available_frequencies(cpu); freqs = cpufreq_get_frequencies("available", cpu); if (freqs) { printf(_(" available frequency steps: ")); while (freqs->next) { Loading @@ -474,7 +494,7 @@ static void debug_output_one(unsigned int cpu) } print_speed(freqs->frequency); printf("\n"); cpufreq_put_available_frequencies(freqs); cpufreq_put_frequencies(freqs); } get_available_governors(cpu); Loading