* Re: [PATCH 00/18] powerpc/boot: 64bit little endian wrapper
From: Cedric Le Goater @ 2014-03-21 8:37 UTC (permalink / raw)
To: Geoff Levand; +Cc: linuxppc-dev
In-Reply-To: <1395335024.20123.2.camel@smoke>
Hi Geoff,
> Do you have these in a git branch somewhere so I can merge and test
> them?
No, sorry, I don't have a public git repo. Let me see how I can fix
that, it might be useful for future patchsets.
Thanks,
C.
^ permalink raw reply
* Re: [PATCH v3 1/5] powernv: cpufreq driver for powernv platform
From: Viresh Kumar @ 2014-03-21 8:41 UTC (permalink / raw)
To: Gautham R. Shenoy
Cc: Linux PM list, linuxppc-dev, Anton Blanchard, Srivatsa S. Bhat
In-Reply-To: <1395317460-14811-2-git-send-email-ego@linux.vnet.ibm.com>
On Thu, Mar 20, 2014 at 5:40 PM, Gautham R. Shenoy
<ego@linux.vnet.ibm.com> wrote:
> From: Vaidyanathan Srinivasan <svaidy@linux.vnet.ibm.com>
Hi Vaidy,
> diff --git a/drivers/cpufreq/Kconfig b/drivers/cpufreq/Kconfig
> index 4b029c0..4ba1632 100644
> --- a/drivers/cpufreq/Kconfig
> +++ b/drivers/cpufreq/Kconfig
> @@ -48,6 +48,7 @@ config CPU_FREQ_STAT_DETAILS
> choice
> prompt "Default CPUFreq governor"
> default CPU_FREQ_DEFAULT_GOV_USERSPACE if ARM_SA1100_CPUFREQ || ARM_SA1110_CPUFREQ
> + default CPU_FREQ_DEFAULT_GOV_ONDEMAND if POWERNV_CPUFREQ
Probably we should remove SA1100's entry as well from here. This is
not the right way of doing it. Imagine 100 platforms having entries here.
If you want it, then select it from your platforms Kconfig.
> diff --git a/drivers/cpufreq/Kconfig.powerpc b/drivers/cpufreq/Kconfig.powerpc
> index ca0021a..93f8689 100644
> --- a/drivers/cpufreq/Kconfig.powerpc
> +++ b/drivers/cpufreq/Kconfig.powerpc
> @@ -54,3 +54,16 @@ config PPC_PASEMI_CPUFREQ
> help
> This adds the support for frequency switching on PA Semi
> PWRficient processors.
> +
> +config POWERNV_CPUFREQ
> + tristate "CPU frequency scaling for IBM POWERNV platform"
> + depends on PPC_POWERNV
> + select CPU_FREQ_GOV_PERFORMANCE
> + select CPU_FREQ_GOV_POWERSAVE
> + select CPU_FREQ_GOV_USERSPACE
> + select CPU_FREQ_GOV_ONDEMAND
> + select CPU_FREQ_GOV_CONSERVATIVE
Nice :)
People normally do this from the defconfigs instead. And logically speaking
we might better have only dependencies here, isn't it? And obviously
governors aren't a dependency for this driver. :)
> + default y
> + help
> + This adds support for CPU frequency switching on IBM POWERNV
> + platform
> diff --git a/drivers/cpufreq/powernv-cpufreq.c b/drivers/cpufreq/powernv-cpufreq.c
> new file mode 100644
> index 0000000..ab1551f
> --- /dev/null
> +++ b/drivers/cpufreq/powernv-cpufreq.c
> @@ -0,0 +1,277 @@
> +/*
> + * POWERNV cpufreq driver for the IBM POWER processors
> + *
> + * (C) Copyright IBM 2014
> + *
> + * Author: Vaidyanathan Srinivasan <svaidy at linux.vnet.ibm.com>
> + *
> + * This program is free software; you can redistribute it and/or modify
> + * it under the terms of the GNU General Public License as published by
> + * the Free Software Foundation; either version 2, or (at your option)
> + * any later version.
> + *
> + * This program is distributed in the hope that it will be useful,
> + * but WITHOUT ANY WARRANTY; without even the implied warranty of
> + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
> + * GNU General Public License for more details.
> + *
> + */
> +
> +#define pr_fmt(fmt) "powernv-cpufreq: " fmt
> +
> +#include <linux/module.h>
> +#include <linux/cpufreq.h>
> +#include <linux/of.h>
> +#include <asm/cputhreads.h>
That's it? Sure?
Even if things compile for you, you must explicitly include all the
files on which
you depend.
> +/* FIXME: Make this per-core */
> +static DEFINE_MUTEX(freq_switch_mutex);
> +
> +#define POWERNV_MAX_PSTATES 256
> +
> +static struct cpufreq_frequency_table powernv_freqs[POWERNV_MAX_PSTATES+1];
> +static int powernv_pstate_ids[POWERNV_MAX_PSTATES+1];
> +
> +/*
> + * Initialize the freq table based on data obtained
> + * from the firmware passed via device-tree
> + */
> +
> +static int init_powernv_pstates(void)
> +{
> + struct device_node *power_mgt;
> + int nr_pstates = 0;
> + int pstate_min, pstate_max, pstate_nominal;
> + const __be32 *pstate_ids, *pstate_freqs;
> + int i;
> + u32 len_ids, len_freqs;
> +
> + power_mgt = of_find_node_by_path("/ibm,opal/power-mgt");
> + if (!power_mgt) {
> + pr_warn("power-mgt node not found\n");
> + return -ENODEV;
> + }
> +
> + if (of_property_read_u32(power_mgt, "ibm,pstate-min", &pstate_min)) {
> + pr_warn("ibm,pstate-min node not found\n");
> + return -ENODEV;
> + }
> +
> + if (of_property_read_u32(power_mgt, "ibm,pstate-max", &pstate_max)) {
> + pr_warn("ibm,pstate-max node not found\n");
> + return -ENODEV;
> + }
> +
> + if (of_property_read_u32(power_mgt, "ibm,pstate-nominal",
> + &pstate_nominal)) {
> + pr_warn("ibm,pstate-nominal not found\n");
> + return -ENODEV;
> + }
> + pr_info("cpufreq pstate min %d nominal %d max %d\n", pstate_min,
> + pstate_nominal, pstate_max);
> +
> + pstate_ids = of_get_property(power_mgt, "ibm,pstate-ids", &len_ids);
> + if (!pstate_ids) {
> + pr_warn("ibm,pstate-ids not found\n");
> + return -ENODEV;
> + }
> +
> + pstate_freqs = of_get_property(power_mgt, "ibm,pstate-frequencies-mhz",
> + &len_freqs);
> + if (!pstate_freqs) {
> + pr_warn("ibm,pstate-frequencies-mhz not found\n");
> + return -ENODEV;
> + }
> +
> + WARN_ON(len_ids != len_freqs);
> + nr_pstates = min(len_ids, len_freqs) / sizeof(u32);
> + WARN_ON(!nr_pstates);
Why do you want to continue here?
> + pr_debug("NR PStates %d\n", nr_pstates);
> + for (i = 0; i < nr_pstates; i++) {
> + u32 id = be32_to_cpu(pstate_ids[i]);
> + u32 freq = be32_to_cpu(pstate_freqs[i]);
> +
> + pr_debug("PState id %d freq %d MHz\n", id, freq);
> + powernv_freqs[i].driver_data = i;
I don't think you are using this field at all and this is the field you can
use for driver_data and so you can get rid of powernv_pstate_ids[ ].
> + powernv_freqs[i].frequency = freq * 1000; /* kHz */
> + powernv_pstate_ids[i] = id;
> + }
> + /* End of list marker entry */
> + powernv_freqs[i].driver_data = 0;
Not required.
> + powernv_freqs[i].frequency = CPUFREQ_TABLE_END;
> +
> + /* Print frequency table */
> + for (i = 0; powernv_freqs[i].frequency != CPUFREQ_TABLE_END; i++)
> + pr_debug("%d: %d\n", i, powernv_freqs[i].frequency);
You have already printed this table earlier..
> +
> + return 0;
> +}
> +
> +static struct freq_attr *powernv_cpu_freq_attr[] = {
> + &cpufreq_freq_attr_scaling_available_freqs,
> + NULL,
> +};
Can use this instead: cpufreq_generic_attr?
> +/* Helper routines */
> +
> +/* Access helpers to power mgt SPR */
> +
> +static inline unsigned long get_pmspr(unsigned long sprn)
Looks big enough not be inlined?
> +{
> + switch (sprn) {
> + case SPRN_PMCR:
> + return mfspr(SPRN_PMCR);
> +
> + case SPRN_PMICR:
> + return mfspr(SPRN_PMICR);
> +
> + case SPRN_PMSR:
> + return mfspr(SPRN_PMSR);
> + }
> + BUG();
> +}
> +
> +static inline void set_pmspr(unsigned long sprn, unsigned long val)
> +{
Same here..
> + switch (sprn) {
> + case SPRN_PMCR:
> + mtspr(SPRN_PMCR, val);
> + return;
> +
> + case SPRN_PMICR:
> + mtspr(SPRN_PMICR, val);
> + return;
> +
> + case SPRN_PMSR:
> + mtspr(SPRN_PMSR, val);
> + return;
> + }
> + BUG();
> +}
> +
> +static void set_pstate(void *pstate)
> +{
> + unsigned long val;
> + unsigned long pstate_ul = *(unsigned long *) pstate;
Why not sending value only to this routine instead of pointer?
> +
> + val = get_pmspr(SPRN_PMCR);
> + val = val & 0x0000ffffffffffffULL;
Maybe a blank line here?
> + /* Set both global(bits 56..63) and local(bits 48..55) PStates */
> + val = val | (pstate_ul << 56) | (pstate_ul << 48);
here as well?
> + pr_debug("Setting cpu %d pmcr to %016lX\n", smp_processor_id(), val);
> + set_pmspr(SPRN_PMCR, val);
> +}
> +
> +static int powernv_set_freq(cpumask_var_t cpus, unsigned int new_index)
> +{
> + unsigned long val = (unsigned long) powernv_pstate_ids[new_index];
I think automatic type conversion will happen here.
> +
> + /*
> + * Use smp_call_function to send IPI and execute the
> + * mtspr on target cpu. We could do that without IPI
> + * if current CPU is within policy->cpus (core)
> + */
Hmm, interesting I also feel there are cases where this routine can
get called from other CPUs. Can you list those use cases where it can
happen? Governors will mostly call this from one of the CPUs present
in policy->cpus.
> + val = val & 0xFF;
> + smp_call_function_any(cpus, set_pstate, &val, 1);
> + return 0;
> +}
> +
> +static int powernv_cpufreq_cpu_init(struct cpufreq_policy *policy)
> +{
> + int base, i;
> +
> +#ifdef CONFIG_SMP
What will break if you don't have this ifdef here? Without that as well
below code should work?
> + base = cpu_first_thread_sibling(policy->cpu);
> +
> + for (i = 0; i < threads_per_core; i++)
> + cpumask_set_cpu(base + i, policy->cpus);
> +#endif
> + policy->cpuinfo.transition_latency = 25000;
> +
> + policy->cur = powernv_freqs[0].frequency;
> + cpufreq_frequency_table_get_attr(powernv_freqs, policy->cpu);
This doesn't exist anymore.
> + return cpufreq_frequency_table_cpuinfo(policy, powernv_freqs);
Have you written this driver long time back? CPUFreq core has been
cleaned up heavily since last few kernel releases and I think there are
better helper routines available now.
> +}
> +
> +static int powernv_cpufreq_cpu_exit(struct cpufreq_policy *policy)
> +{
> + cpufreq_frequency_table_put_attr(policy->cpu);
> + return 0;
> +}
You don't need this..
> +static int powernv_cpufreq_verify(struct cpufreq_policy *policy)
> +{
> + return cpufreq_frequency_table_verify(policy, powernv_freqs);
> +}
use generic verify function pointer instead..
> +static int powernv_cpufreq_target(struct cpufreq_policy *policy,
> + unsigned int target_freq,
> + unsigned int relation)
use target_index() instead..
> +{
> + int rc;
> + struct cpufreq_freqs freqs;
> + unsigned int new_index;
> +
> + cpufreq_frequency_table_target(policy, powernv_freqs, target_freq,
> + relation, &new_index);
> +
> + freqs.old = policy->cur;
> + freqs.new = powernv_freqs[new_index].frequency;
> + freqs.cpu = policy->cpu;
> +
> + mutex_lock(&freq_switch_mutex);
Why do you need this lock for?
> + cpufreq_notify_transition(policy, &freqs, CPUFREQ_PRECHANGE);
> +
> + pr_debug("setting frequency for cpu %d to %d kHz index %d pstate %d",
> + policy->cpu,
> + powernv_freqs[new_index].frequency,
> + new_index,
> + powernv_pstate_ids[new_index]);
> +
> + rc = powernv_set_freq(policy->cpus, new_index);
> +
> + cpufreq_notify_transition(policy, &freqs, CPUFREQ_POSTCHANGE);
> + mutex_unlock(&freq_switch_mutex);
> +
> + return rc;
> +}
> +
> +static struct cpufreq_driver powernv_cpufreq_driver = {
> + .verify = powernv_cpufreq_verify,
> + .target = powernv_cpufreq_target,
I think you have Srivatsa there who has seen lots of cpufreq code and
could have helped you a lot :)
> + .init = powernv_cpufreq_cpu_init,
> + .exit = powernv_cpufreq_cpu_exit,
> + .name = "powernv-cpufreq",
> + .flags = CPUFREQ_CONST_LOOPS,
> + .attr = powernv_cpu_freq_attr,
Would be better if you keep these callbacks in the order they are declared
in cpufreq.h..
> +};
> +
> +static int __init powernv_cpufreq_init(void)
> +{
> + int rc = 0;
> +
> + /* Discover pstates from device tree and init */
> +
Remove blank line.
> + rc = init_powernv_pstates();
> +
same here..
> + if (rc) {
> + pr_info("powernv-cpufreq disabled\n");
> + return rc;
> + }
> +
> + rc = cpufreq_register_driver(&powernv_cpufreq_driver);
> + return rc;
Merge above two lines.
> +}
> +
> +static void __exit powernv_cpufreq_exit(void)
> +{
> + cpufreq_unregister_driver(&powernv_cpufreq_driver);
> +}
> +
> +module_init(powernv_cpufreq_init);
> +module_exit(powernv_cpufreq_exit);
Place these right after the routines without any blank lines in between.
> +MODULE_LICENSE("GPL");
> +MODULE_AUTHOR("Vaidyanathan Srinivasan <svaidy at linux.vnet.ibm.com>");
^ permalink raw reply
* Re: [PATCH v3 2/5] powernv, cpufreq:Add per-core locking to serialize frequency transitions
From: Viresh Kumar @ 2014-03-21 8:42 UTC (permalink / raw)
To: Gautham R. Shenoy; +Cc: linuxppc-dev, Srivatsa S. Bhat, Linux PM list
In-Reply-To: <1395317460-14811-3-git-send-email-ego@linux.vnet.ibm.com>
On Thu, Mar 20, 2014 at 5:40 PM, Gautham R. Shenoy
<ego@linux.vnet.ibm.com> wrote:
> From: "Srivatsa S. Bhat" <srivatsa.bhat@linux.vnet.ibm.com>
>
> On POWER systems, the CPU frequency is controlled at a core-level and
> hence we need to serialize so that only one of the threads in the core
> switches the core's frequency at a time.
Probably you don't need this anymore.
https://lkml.org/lkml/2014/3/21/23
^ permalink raw reply
* Re: [PATCH v3 4/5] powernv:cpufreq: Export nominal frequency via sysfs.
From: Viresh Kumar @ 2014-03-21 8:47 UTC (permalink / raw)
To: Gautham R. Shenoy; +Cc: linuxppc-dev, Linux PM list
In-Reply-To: <1395317460-14811-5-git-send-email-ego@linux.vnet.ibm.com>
On Thu, Mar 20, 2014 at 5:40 PM, Gautham R. Shenoy
<ego@linux.vnet.ibm.com> wrote:
> From: "Gautham R. Shenoy" <ego@linux.vnet.ibm.com>
>
> Create a driver attribute named cpuinfo_nominal_freq which
> creates a sysfs read-only file named cpuinfo_nominal_freq. Export
> the frequency corresponding to the nominal_pstate through this
> interface.
>
> Nominal frequency is the highest non-turbo frequency for the
> platform. This is generally used for setting governor policies from
> user space for optimal energy efficiency.
>
> Signed-off-by: Gautham R. Shenoy <ego@linux.vnet.ibm.com>
> ---
> drivers/cpufreq/powernv-cpufreq.c | 22 ++++++++++++++++++++++
> 1 file changed, 22 insertions(+)
>
> diff --git a/drivers/cpufreq/powernv-cpufreq.c b/drivers/cpufreq/powernv-cpufreq.c
> index e7b0292..46bee8a 100644
> --- a/drivers/cpufreq/powernv-cpufreq.c
> +++ b/drivers/cpufreq/powernv-cpufreq.c
> @@ -142,8 +142,30 @@ static unsigned int pstate_id_to_freq(int pstate_id)
> return powernv_freqs[i].frequency;
> }
>
> +/**
> + * show_cpuinfo_nominal_freq - Show the nominal CPU frequency as indicated by
> + * the firmware
> + */
> +static ssize_t show_cpuinfo_nominal_freq(struct cpufreq_policy *policy,
> + char *buf)
> +{
> + int nominal_freq;
> + nominal_freq = pstate_id_to_freq(powernv_pstate_info.pstate_nominal_id);
> + return sprintf(buf, "%u\n", nominal_freq);
return sprintf(buf, "%u\n",
pstate_id_to_freq(powernv_pstate_info.pstate_nominal_id));
??
> +}
> +
> +
remove extra blank line.
> +struct freq_attr cpufreq_freq_attr_cpuinfo_nominal_freq = {
> + .attr = { .name = "cpuinfo_nominal_freq",
> + .mode = 0444,
> + },
Align {}
> + .show = show_cpuinfo_nominal_freq,
> +};
> +
> +
> static struct freq_attr *powernv_cpu_freq_attr[] = {
> &cpufreq_freq_attr_scaling_available_freqs,
> + &cpufreq_freq_attr_cpuinfo_nominal_freq,
> NULL,
> };
^ permalink raw reply
* RE: [PATCH 9/9] powerpc/pm: support deep sleep feature on T1040
From: David Laight @ 2014-03-21 9:21 UTC (permalink / raw)
To: 'Scott Wood'
Cc: linuxppc-dev@lists.ozlabs.org, 'Kevin Hao', Chenhui Zhao,
Jason.Jin@freescale.com, linux-kernel@vger.kernel.org
In-Reply-To: <1395353279.12479.335.camel@snotra.buserror.net>
RnJvbTogU2NvdHQgV29vZCBbbWFpbHRvOnNjb3R0d29vZEBmcmVlc2NhbGUuY29tXQ0KPiBPbiBU
aHUsIDIwMTQtMDMtMjAgYXQgMTE6NTkgKzAwMDAsIERhdmlkIExhaWdodCB3cm90ZToNCj4gPiBJ
IHRyaWVkIHRvIHdvcmsgb3V0IHdoYXQgdGhlICd0d2ksIGlzeW5jJyBpbnN0cnVjdGlvbnMgd2Vy
ZSBmb3IgKGluIGluX2xlMzIoKSkuDQo+ID4gVGhlIGJlc3QgSSBjb3VsZCBjb21lIHVwIHdpdGgg
d2FzIHRvIGVuc3VyZSBhIHN5bmNocm9ub3VzIGJ1cy1mYXVsdC4NCj4gPiBCdXQgYnVzIGZhdWx0
cyBhcmUgcHJvYmFibHkgb25seSBleHBlY3RlZCBkdXJpbmcgZGV2aWNlIHByb2JpbmcgLSBub3QN
Cj4gPiBub3JtYWwgb3BlcmF0aW9uLCBhbmQgdGhlIGluc3RydWN0aW9ucyB3aWxsIGhhdmUgYSBz
aWduaWZpY2FudCBjb3N0Lg0KPiA+DQo+ID4gQWRkaXRpb25hbGx5IGluX2xlMzIoKSBhbmQgb3V0
X2xlMzIoKSBib3RoIHN0YXJ0IHdpdGggYSAnc3luYycgaW5zdHJ1Y3Rpb24uDQo+ID4gSW4gbWFu
eSBjYXNlcyB0aGF0IGlzbid0IG5lZWRlZCBlaXRoZXIgLSBhbiBleHBsaWNpdCBpb3N5bmMoKSBj
YW4gYmUNCj4gPiB1c2VkIGFmdGVyIGdyb3VwcyBvZiBpbnN0cnVjdGlvbnMuDQo+IA0KPiBUaGUg
aWRlYSBpcyB0aGF0IGl0J3MgYmV0dGVyIHRvIGJlIG1heGltYWxseSBzYWZlIGJ5IGRlZmF1bHQs
IGFuZCBsZXQNCj4gcGVyZm9ybWFuY2UgY3JpdGljYWwgc2VjdGlvbnMgYmUgb3B0aW1pemVkIHVz
aW5nIHJhdyBhY2Nlc3NvcnMgYW5kDQo+IGV4cGxpY2l0IHN5bmNocm9uaXphdGlvbiBpZiBuZWVk
ZWQsIHRoYW4gdG8gaGF2ZSBoYXJkLXRvLWRlYnVnIGJ1Z3MgZHVlDQo+IHRvIG1pc3Npbmcvd3Jv
bmcgc3luYy4gIEEgbG90IG9mIEkvTyBpcyBzbG93IGVub3VnaCB0aGF0IHRoZSBwZXJmb3JtYW5j
ZQ0KPiBpbXBhY3QgZG9lc24ndCByZWFsbHkgbWF0dGVyLCBidXQgdGhlIGJyYWluLXRpbWUgY29z
dCBvZiBnZXR0aW5nIHRoZQ0KPiBzeW5jIHJpZ2h0IGlzIHN0aWxsIHRoZXJlLg0KDQpIbW1tLi4u
Lg0KDQpUaGF0IG1pZ2h0IGJlIGFuIGV4Y3VzZSBmb3IgdGhlICdzeW5jJywgYnV0IG5vdCB0aGUg
dHdpIGFuZCBpc3luYy4NCg0KSSB3YXMgc2V0dGluZyB1cCBhIGRtYSByZXF1ZXN0IChmb3IgdGhl
IHBwYyA4M3h4IFBDSWUgYnJpZGdlKSBhbmQNCndhcyBkb2luZyBiYWNrIHRvIGJhY2sgbGl0dGxl
LWVuZGlhbiB3cml0ZXMgaW50byBtZW1vcnkuDQpJIGhhZCBkaWZmaWN1bHR5IGZpbmRpbmcgYW5k
IGluY2x1ZGluZyBoZWFkZXIgZmlsZXMgY29udGFpbmluZw0KdGhlIGRlZmluaXRpb25zIGZvciBi
eXRlc3dhcHBlZCBhY2Nlc3NlcyBJIG5lZWRlZC4NCmFyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9z
d2FiLmggY29udGFpbnMgc29tZSAtIGJ1dCBJIGNvdWxkbid0DQp3b3JrIG91dCBob3cgdG8gZ2V0
IGl0IGluY2x1ZGVkIChhcGFydCBmcm9tIGdpdmluZyB0aGUgZnVsbCBwYXRoKS4NCg0KSW4gYW55
IGNhc2UgeW91IG5lZWQgdG8gdW5kZXJzdGFuZCB3aGVuIHN5bmNocm9uaXNhdGlvbiBpcw0KcmVx
dWlyZWQgLSBvdGhlcndpc2UgeW91IHdpbGwgZ2V0IGl0IHdyb25nLg0KRXNwZWNpYWxseSBzaW5j
ZSBub24tYnl0ZXN3YXBwZWQgYWNjZXNzZXMgYXJlIGRvbmUgYnkgZGlyZWN0DQphY2Nlc3MuDQoN
CglEYXZpZA0KDQo=
^ permalink raw reply
* Re: [PATCH v3 5/5] powernv:cpufreq: Implement the driver->get() method
From: Viresh Kumar @ 2014-03-21 9:31 UTC (permalink / raw)
To: Gautham R. Shenoy; +Cc: linuxppc-dev, Linux PM list
In-Reply-To: <1395317460-14811-6-git-send-email-ego@linux.vnet.ibm.com>
On Thu, Mar 20, 2014 at 5:41 PM, Gautham R. Shenoy
<ego@linux.vnet.ibm.com> wrote:
> From: "Gautham R. Shenoy" <ego@linux.vnet.ibm.com>
>
> The current frequency of a cpu is reported through the sysfs file
> cpuinfo_cur_freq. This requires the driver to implement a
> "->get(unsigned int cpu)" method which will return the current
> operating frequency.
>
> Implement a function named powernv_cpufreq_get() which reads the local
> pstate from the PMSR and returns the corresponding frequency.
>
> Set the powernv_cpufreq_driver.get hook to powernv_cpufreq_get().
>
> Signed-off-by: Gautham R. Shenoy <ego@linux.vnet.ibm.com>
> ---
> drivers/cpufreq/powernv-cpufreq.c | 38 ++++++++++++++++++++++++++++++++++++++
> 1 file changed, 38 insertions(+)
Please merge these fixups with the first patch which is creating the driver.
I understand that a different guy has created this patch and so wanted
to have a patch on his name but its really difficult to review this way.
Better add your signed-off in the first patch instead. Sending such changes
once the driver is mainlined looks fine.
> diff --git a/drivers/cpufreq/powernv-cpufreq.c b/drivers/cpufreq/powernv-cpufreq.c
> index 46bee8a..ef6ed8c 100644
> --- a/drivers/cpufreq/powernv-cpufreq.c
> +++ b/drivers/cpufreq/powernv-cpufreq.c
> @@ -206,6 +206,43 @@ static inline void set_pmspr(unsigned long sprn, unsigned long val)
> BUG();
> }
>
> +/*
> + * Computes the current frequency on this cpu
> + * and stores the result in *ret_freq.
> + */
> +static void powernv_read_cpu_freq(void *ret_freq)
> +{
> + unsigned long pmspr_val;
> + s8 local_pstate_id;
> + int *cur_freq, freq, pstate_id;
> +
> + cur_freq = (int *)ret_freq;
You don't need cur_freq variable at all..
> + pmspr_val = get_pmspr(SPRN_PMSR);
> +
> + /* The local pstate id corresponds bits 48..55 in the PMSR.
> + * Note: Watch out for the sign! */
> + local_pstate_id = (pmspr_val >> 48) & 0xFF;
> + pstate_id = local_pstate_id;
similarly local_pstate_id
> +
> + freq = pstate_id_to_freq(pstate_id);
> + pr_debug("cpu %d pmsr %lx pstate_id %d frequency %d \n",
> + smp_processor_id(), pmspr_val, pstate_id, freq);
> + *cur_freq = freq;
Move above print here after a blank line. Also remove freq variable as
well and use *cur_freq directly.. And then you can rename it to freq as well.
> +}
> +
> +/*
> + * Returns the cpu frequency as reported by the firmware for 'cpu'.
> + * This value is reported through the sysfs file cpuinfo_cur_freq.
> + */
> +unsigned int powernv_cpufreq_get(unsigned int cpu)
> +{
> + int ret_freq;
> +
> + smp_call_function_any(cpu_sibling_mask(cpu), powernv_read_cpu_freq,
> + &ret_freq, 1);
> + return ret_freq;
> +}
> +
> static void set_pstate(void *pstate)
> {
> unsigned long val;
> @@ -297,6 +334,7 @@ static int powernv_cpufreq_target(struct cpufreq_policy *policy,
> static struct cpufreq_driver powernv_cpufreq_driver = {
> .verify = powernv_cpufreq_verify,
> .target = powernv_cpufreq_target,
> + .get = powernv_cpufreq_get,
> .init = powernv_cpufreq_cpu_init,
> .exit = powernv_cpufreq_cpu_exit,
> .name = "powernv-cpufreq",
> --
> 1.8.3.1
>
> --
> To unsubscribe from this list: send the line "unsubscribe linux-pm" in
> the body of a message to majordomo@vger.kernel.org
> More majordomo info at http://vger.kernel.org/majordomo-info.html
^ permalink raw reply
* Re: [PATCH 00/18] powerpc/boot: 64bit little endian wrapper
From: Cedric Le Goater @ 2014-03-21 9:37 UTC (permalink / raw)
To: Geoff Levand; +Cc: linuxppc-dev
In-Reply-To: <532BFA38.9090904@fr.ibm.com>
Hi Geoff,
>> Do you have these in a git branch somewhere so I can merge and test
>> them?
>
> No, sorry, I don't have a public git repo. Let me see how I can fix
> that, it might be useful for future patchsets.
Please try that :
git pull git://github.com/legoater/linux.git zimage
Thanks,
C.
^ permalink raw reply
* Re: [PATCH v3 4/5] powernv:cpufreq: Export nominal frequency via sysfs.
From: Gautham R Shenoy @ 2014-03-21 9:55 UTC (permalink / raw)
To: Viresh Kumar; +Cc: Gautham R. Shenoy, Linux PM list, linuxppc-dev
In-Reply-To: <CAOh2x=kLwDGFtHR5sBKhE-9L=3=npV4_i+B+BVm+yBocmmMvzQ@mail.gmail.com>
On Fri, Mar 21, 2014 at 02:17:28PM +0530, Viresh Kumar wrote:
> > +static ssize_t show_cpuinfo_nominal_freq(struct cpufreq_policy *policy,
> > + char *buf)
> > +{
> > + int nominal_freq;
> > + nominal_freq = pstate_id_to_freq(powernv_pstate_info.pstate_nominal_id);
> > + return sprintf(buf, "%u\n", nominal_freq);
>
> return sprintf(buf, "%u\n",
> pstate_id_to_freq(powernv_pstate_info.pstate_nominal_id));
Sure. Will fix this.
>
> ??
>
> > +}
> > +
> > +
>
> remove extra blank line.
>
> > +struct freq_attr cpufreq_freq_attr_cpuinfo_nominal_freq = {
> > + .attr = { .name = "cpuinfo_nominal_freq",
> > + .mode = 0444,
> > + },
>
> Align {}
Probably the use of ATTR_RO(cpuinfo_nominal_freq) and renaming
show_cpuinfo_nominal_freq to cpuinfo_nominal_freq_show() would be even
better. What do you think ?
>
> > + .show = show_cpuinfo_nominal_freq,
> > +};
> > +
> > +
> > static struct freq_attr *powernv_cpu_freq_attr[] = {
> > &cpufreq_freq_attr_scaling_available_freqs,
> > + &cpufreq_freq_attr_cpuinfo_nominal_freq,
> > NULL,
> > };
This needs to be rewritten to include the entries of cpufreq_generic_attr.
>
Thanks for the review.
--
Regards
gautham.
^ permalink raw reply
* Re: [PATCH v3 2/5] powernv, cpufreq:Add per-core locking to serialize frequency transitions
From: Srivatsa S. Bhat @ 2014-03-21 9:56 UTC (permalink / raw)
To: Viresh Kumar; +Cc: Gautham R. Shenoy, Linux PM list, linuxppc-dev
In-Reply-To: <CAOh2x==Lzeatp=7BoxuSH4PfxXqWqpHJ_KcwWdXXsFAftxTMCQ@mail.gmail.com>
On 03/21/2014 02:12 PM, Viresh Kumar wrote:
> On Thu, Mar 20, 2014 at 5:40 PM, Gautham R. Shenoy
> <ego@linux.vnet.ibm.com> wrote:
>> From: "Srivatsa S. Bhat" <srivatsa.bhat@linux.vnet.ibm.com>
>>
>> On POWER systems, the CPU frequency is controlled at a core-level and
>> hence we need to serialize so that only one of the threads in the core
>> switches the core's frequency at a time.
>
> Probably you don't need this anymore.
>
> https://lkml.org/lkml/2014/3/21/23
>
Agreed.
Regards,
Srivatsa S. Bhat
^ permalink raw reply
* Re: [PATCH v3 4/5] powernv:cpufreq: Export nominal frequency via sysfs.
From: Viresh Kumar @ 2014-03-21 9:57 UTC (permalink / raw)
To: ego@linux.vnet.ibm.com; +Cc: linuxppc-dev, Linux PM list
In-Reply-To: <20140321095534.GF27293@in.ibm.com>
On 21 March 2014 15:25, Gautham R Shenoy <ego@linux.vnet.ibm.com> wrote:
> Probably the use of ATTR_RO(cpuinfo_nominal_freq) and renaming
> show_cpuinfo_nominal_freq to cpuinfo_nominal_freq_show() would be even
> better. What do you think ?
+1
^ permalink raw reply
* Re: [PATCH v3 1/5] powernv: cpufreq driver for powernv platform
From: Gautham R Shenoy @ 2014-03-21 10:43 UTC (permalink / raw)
To: Viresh Kumar
Cc: Gautham R. Shenoy, Linux PM list, linuxppc-dev, Anton Blanchard,
Srivatsa S. Bhat
In-Reply-To: <CAOh2x=kp65vrKamtxxR9iCX+t-S3nDJP05+1mfpOiWzbWpfGYA@mail.gmail.com>
Hi Viresh,
On Fri, Mar 21, 2014 at 02:11:32PM +0530, Viresh Kumar wrote:
> On Thu, Mar 20, 2014 at 5:40 PM, Gautham R. Shenoy
> <ego@linux.vnet.ibm.com> wrote:
> > From: Vaidyanathan Srinivasan <svaidy@linux.vnet.ibm.com>
>
> Hi Vaidy,
>
> > diff --git a/drivers/cpufreq/Kconfig b/drivers/cpufreq/Kconfig
> > index 4b029c0..4ba1632 100644
> > --- a/drivers/cpufreq/Kconfig
> > +++ b/drivers/cpufreq/Kconfig
> > @@ -48,6 +48,7 @@ config CPU_FREQ_STAT_DETAILS
> > choice
> > prompt "Default CPUFreq governor"
> > default CPU_FREQ_DEFAULT_GOV_USERSPACE if ARM_SA1100_CPUFREQ || ARM_SA1110_CPUFREQ
> > + default CPU_FREQ_DEFAULT_GOV_ONDEMAND if POWERNV_CPUFREQ
>
> Probably we should remove SA1100's entry as well from here. This is
> not the right way of doing it. Imagine 100 platforms having entries here.
> If you want it, then select it from your platforms Kconfig.
Sure. Will move these bits and the other governor related bits to the
Powernv Kconfig.
> > diff --git a/drivers/cpufreq/powernv-cpufreq.c b/drivers/cpufreq/powernv-cpufreq.c
> > new file mode 100644
> > index 0000000..ab1551f
> > --- /dev/null
> > +
> > +#define pr_fmt(fmt) "powernv-cpufreq: " fmt
> > +
> > +#include <linux/module.h>
> > +#include <linux/cpufreq.h>
> > +#include <linux/of.h>
> > +#include <asm/cputhreads.h>
>
> That's it? Sure?
>
> Even if things compile for you, you must explicitly include all the
> files on which
> you depend.
Ok.
>
> > +
> > + WARN_ON(len_ids != len_freqs);
> > + nr_pstates = min(len_ids, len_freqs) / sizeof(u32);
> > + WARN_ON(!nr_pstates);
>
> Why do you want to continue here?
Good point. We might be better off exiting at this point.
>
> > + pr_debug("NR PStates %d\n", nr_pstates);
> > + for (i = 0; i < nr_pstates; i++) {
> > + u32 id = be32_to_cpu(pstate_ids[i]);
> > + u32 freq = be32_to_cpu(pstate_freqs[i]);
> > +
> > + pr_debug("PState id %d freq %d MHz\n", id, freq);
> > + powernv_freqs[i].driver_data = i;
>
> I don't think you are using this field at all and this is the field you can
> use for driver_data and so you can get rid of powernv_pstate_ids[ ].
Using driver_data to record powernv_pstate_ids won't work since
powernv_pstate_ids can be negative. So a pstate_id -3 can be confused
with CPUFREQ_BOOST_FREQ thereby not displaying the frequency
corresponding to pstate id -3. So for now I think we will be retaining
powernv_pstate_ids.
>
> > + powernv_freqs[i].frequency = freq * 1000; /* kHz */
> > + powernv_pstate_ids[i] = id;
> > + }
> > + /* End of list marker entry */
> > + powernv_freqs[i].driver_data = 0;
>
> Not required.
Ok.
>
> > + powernv_freqs[i].frequency = CPUFREQ_TABLE_END;
> > +
> > + /* Print frequency table */
> > + for (i = 0; powernv_freqs[i].frequency != CPUFREQ_TABLE_END; i++)
> > + pr_debug("%d: %d\n", i, powernv_freqs[i].frequency);
>
> You have already printed this table earlier..
Fair enough.
>
> > +
> > + return 0;
> > +}
> > +
> > +static struct freq_attr *powernv_cpu_freq_attr[] = {
> > + &cpufreq_freq_attr_scaling_available_freqs,
> > + NULL,
> > +};
>
> Can use this instead: cpufreq_generic_attr?
In this patch yes. But later patch introduces an additional attribute
for displaying the nominal frequency. Will handle that part in a clean
way in the next version.
>
> > +/* Helper routines */
> > +
> > +/* Access helpers to power mgt SPR */
> > +
> > +static inline unsigned long get_pmspr(unsigned long sprn)
>
> Looks big enough not be inlined?
It is called from one function. It has been defined separately for
readability.
>
> > +{
> > + switch (sprn) {
> > + case SPRN_PMCR:
> > + return mfspr(SPRN_PMCR);
> > +
> > + case SPRN_PMICR:
> > + return mfspr(SPRN_PMICR);
> > +
> > + case SPRN_PMSR:
> > + return mfspr(SPRN_PMSR);
> > + }
> > + BUG();
> > +}
> > +
> > +static inline void set_pmspr(unsigned long sprn, unsigned long val)
> > +{
>
> Same here..
Same reason as above.
>
> > + switch (sprn) {
> > + case SPRN_PMCR:
> > + mtspr(SPRN_PMCR, val);
> > + return;
> > +
> > + case SPRN_PMICR:
> > + mtspr(SPRN_PMICR, val);
> > + return;
> > +
> > + case SPRN_PMSR:
> > + mtspr(SPRN_PMSR, val);
> > + return;
> > + }
> > + BUG();
> > +}
> > +
> > +static void set_pstate(void *pstate)
> > +{
> > + unsigned long val;
> > + unsigned long pstate_ul = *(unsigned long *) pstate;
>
> Why not sending value only to this routine instead of pointer?
Well this function is called via an smp_call_function. so, cannot send
a value :(
>
> > +
> > + val = get_pmspr(SPRN_PMCR);
> > + val = val & 0x0000ffffffffffffULL;
>
> Maybe a blank line here?
Ok.
>
> > + /* Set both global(bits 56..63) and local(bits 48..55) PStates */
> > + val = val | (pstate_ul << 56) | (pstate_ul << 48);
>
> here as well?
Ok.
>
> > + pr_debug("Setting cpu %d pmcr to %016lX\n", smp_processor_id(), val);
> > + set_pmspr(SPRN_PMCR, val);
> > +}
> > +
> > +static int powernv_set_freq(cpumask_var_t cpus, unsigned int new_index)
> > +{
> > + unsigned long val = (unsigned long) powernv_pstate_ids[new_index];
>
> I think automatic type conversion will happen here.
Ok. Will fix this.
>
> > +
> > + /*
> > + * Use smp_call_function to send IPI and execute the
> > + * mtspr on target cpu. We could do that without IPI
> > + * if current CPU is within policy->cpus (core)
> > + */
>
> Hmm, interesting I also feel there are cases where this routine can
> get called from other CPUs. Can you list those use cases where it can
> happen? Governors will mostly call this from one of the CPUs present
> in policy->cpus.
Consider the case when the governor is userspace and we are executing
# echo freqvalue >
/sys/devices/system/cpu/cpu<i>/cpufreq/scaling_setspeed
from a cpu <j> which is not in policy->cpus of cpu i.
> > +static int powernv_cpufreq_cpu_init(struct cpufreq_policy *policy)
> > +{
> > + int base, i;
> > +
> > +#ifdef CONFIG_SMP
>
> What will break if you don't have this ifdef here? Without that as well
> below code should work?
>
> > + base = cpu_first_thread_sibling(policy->cpu);
> > +
> > + for (i = 0; i < threads_per_core; i++)
> > + cpumask_set_cpu(base + i, policy->cpus);
> > +#endif
> > + policy->cpuinfo.transition_latency = 25000;
> > +
> > + policy->cur = powernv_freqs[0].frequency;
> > + cpufreq_frequency_table_get_attr(powernv_freqs, policy->cpu);
>
> This doesn't exist anymore.
Didn't get this comment!
>
> > + return cpufreq_frequency_table_cpuinfo(policy, powernv_freqs);
>
> Have you written this driver long time back? CPUFreq core has been
> cleaned up heavily since last few kernel releases and I think there are
> better helper routines available now.
Yup it was written quite a while ago. And yeah, CPUFreq has changed
quite a bit since the last time I saw it :-)
>
> > +}
> > +
> > +static int powernv_cpufreq_cpu_exit(struct cpufreq_policy *policy)
> > +{
> > + cpufreq_frequency_table_put_attr(policy->cpu);
> > + return 0;
> > +}
>
> You don't need this..
Why not ?
>
> > +static int powernv_cpufreq_verify(struct cpufreq_policy *policy)
> > +{
> > + return cpufreq_frequency_table_verify(policy, powernv_freqs);
> > +}
>
> use generic verify function pointer instead..
>
> > +static int powernv_cpufreq_target(struct cpufreq_policy *policy,
> > + unsigned int target_freq,
> > + unsigned int relation)
>
> use target_index() instead..
>
> > +{
> > + int rc;
> > + struct cpufreq_freqs freqs;
> > + unsigned int new_index;
> > +
> > + cpufreq_frequency_table_target(policy, powernv_freqs, target_freq,
> > + relation, &new_index);
> > +
> > + freqs.old = policy->cur;
> > + freqs.new = powernv_freqs[new_index].frequency;
> > + freqs.cpu = policy->cpu;
> > +
> > + mutex_lock(&freq_switch_mutex);
>
> Why do you need this lock for?
I guess it was to serialize accesses to PMCR. But Srivatsa's patch
converts this to a per-core lock which probably is no longer required
after your cpufreq_freq_transition_begin/end() patch series.
>
> > + cpufreq_notify_transition(policy, &freqs, CPUFREQ_PRECHANGE);
> > +
> > + pr_debug("setting frequency for cpu %d to %d kHz index %d pstate %d",
> > + policy->cpu,
> > + powernv_freqs[new_index].frequency,
> > + new_index,
> > + powernv_pstate_ids[new_index]);
> > +
> > + rc = powernv_set_freq(policy->cpus, new_index);
> > +
> > + cpufreq_notify_transition(policy, &freqs, CPUFREQ_POSTCHANGE);
> > + mutex_unlock(&freq_switch_mutex);
> > +
> > + return rc;
> > +}
> > +
> > +static struct cpufreq_driver powernv_cpufreq_driver = {
> > + .verify = powernv_cpufreq_verify,
> > + .target = powernv_cpufreq_target,
>
> I think you have Srivatsa there who has seen lots of cpufreq code and
> could have helped you a lot :)
>
> > + .init = powernv_cpufreq_cpu_init,
> > + .exit = powernv_cpufreq_cpu_exit,
> > + .name = "powernv-cpufreq",
> > + .flags = CPUFREQ_CONST_LOOPS,
> > + .attr = powernv_cpu_freq_attr,
>
> Would be better if you keep these callbacks in the order they are declared
> in cpufreq.h..
Sure.
>
> > +module_init(powernv_cpufreq_init);
> > +module_exit(powernv_cpufreq_exit);
>
> Place these right after the routines without any blank lines in
between.
Is this the new convention ?
>
> > +MODULE_LICENSE("GPL");
> > +MODULE_AUTHOR("Vaidyanathan Srinivasan <svaidy at linux.vnet.ibm.com>");
>
Thanks for the detailed review.
--
Regards
gautham.
^ permalink raw reply
* Re: [PATCH v3 1/5] powernv: cpufreq driver for powernv platform
From: Viresh Kumar @ 2014-03-21 10:54 UTC (permalink / raw)
To: ego@linux.vnet.ibm.com
Cc: Linux PM list, linuxppc-dev, Anton Blanchard, Srivatsa S. Bhat
In-Reply-To: <20140321104317.GA2493@in.ibm.com>
On 21 March 2014 16:13, Gautham R Shenoy <ego@linux.vnet.ibm.com> wrote:
> On Fri, Mar 21, 2014 at 02:11:32PM +0530, Viresh Kumar wrote:
>> > + pr_debug("PState id %d freq %d MHz\n", id, freq);
>> > + powernv_freqs[i].driver_data = i;
>>
>> I don't think you are using this field at all and this is the field you can
>> use for driver_data and so you can get rid of powernv_pstate_ids[ ].
>
> Using driver_data to record powernv_pstate_ids won't work since
> powernv_pstate_ids can be negative. So a pstate_id -3 can be confused
> with CPUFREQ_BOOST_FREQ thereby not displaying the frequency
> corresponding to pstate id -3. So for now I think we will be retaining
> powernv_pstate_ids.
As I said earlier, this field is only used by cpufreq drivers and cpufreq core
isn't supposed to touch it. CPUFREQ_BOOST_FREQ and other macros
are there for .frequency field and not this one.
>> > +static int powernv_cpufreq_cpu_init(struct cpufreq_policy *policy)
>> > +{
>> > + int base, i;
>> > +
>> > +#ifdef CONFIG_SMP
>>
>> What will break if you don't have this ifdef here? Without that as well
>> below code should work?
Missed this one?
>> > + base = cpu_first_thread_sibling(policy->cpu);
>> > +
>> > + for (i = 0; i < threads_per_core; i++)
>> > + cpumask_set_cpu(base + i, policy->cpus);
>> > +#endif
>> > + policy->cpuinfo.transition_latency = 25000;
>> > +
>> > + policy->cur = powernv_freqs[0].frequency;
>> > + cpufreq_frequency_table_get_attr(powernv_freqs, policy->cpu);
>>
>> This doesn't exist anymore.
>
> Didn't get this comment!
cpufreq_frequency_table_get_attr() routine doesn't exist anymore.
>> > +static int powernv_cpufreq_cpu_exit(struct cpufreq_policy *policy)
>> > +{
>> > + cpufreq_frequency_table_put_attr(policy->cpu);
>> > + return 0;
>> > +}
>>
>> You don't need this..
>
> Why not ?
Because cpufreq_frequency_table_get_attr() and
cpufreq_frequency_table_put_attr() don't exist anymore :)
>> > +module_init(powernv_cpufreq_init);
>> > +module_exit(powernv_cpufreq_exit);
>>
>> Place these right after the routines without any blank lines in
> between.
>
> Is this the new convention ?
Don't know I have been following this since long time, probably from the
time I started with Mainline stuff.. I have seen many maintainers advising this
as it make code more readable, specially if these routines are quite big..
Probably it isn't mentioned in coding guidelines but people follow it most of
the times.
^ permalink raw reply
* Re: [PATCH v3 5/5] powernv:cpufreq: Implement the driver->get() method
From: Gautham R Shenoy @ 2014-03-21 11:04 UTC (permalink / raw)
To: Viresh Kumar; +Cc: Gautham R. Shenoy, Linux PM list, linuxppc-dev
In-Reply-To: <CAOh2x==9JT-q2w95Ub_Ck_UMPcWY_4vo_Y44-i=DPjtu0jxwZg@mail.gmail.com>
On Fri, Mar 21, 2014 at 03:01:29PM +0530, Viresh Kumar wrote:
> On Thu, Mar 20, 2014 at 5:41 PM, Gautham R. Shenoy
> <ego@linux.vnet.ibm.com> wrote:
> > From: "Gautham R. Shenoy" <ego@linux.vnet.ibm.com>
> >
> > The current frequency of a cpu is reported through the sysfs file
> > cpuinfo_cur_freq. This requires the driver to implement a
> > "->get(unsigned int cpu)" method which will return the current
> > operating frequency.
> >
> > Implement a function named powernv_cpufreq_get() which reads the local
> > pstate from the PMSR and returns the corresponding frequency.
> >
> > Set the powernv_cpufreq_driver.get hook to powernv_cpufreq_get().
> >
> > Signed-off-by: Gautham R. Shenoy <ego@linux.vnet.ibm.com>
> > ---
> > drivers/cpufreq/powernv-cpufreq.c | 38 ++++++++++++++++++++++++++++++++++++++
> > 1 file changed, 38 insertions(+)
>
> Please merge these fixups with the first patch which is creating the driver.
> I understand that a different guy has created this patch and so wanted
> to have a patch on his name but its really difficult to review this
way.
Heh! Well, that wasn't the reason why this was sent out as a separate
patch, but never mind. Though I don't understand why it would be
difficult to review the patch though.
> Better add your signed-off in the first patch instead. Sending such changes
> once the driver is mainlined looks fine.
Sure, this makes sense.
>
> > diff --git a/drivers/cpufreq/powernv-cpufreq.c b/drivers/cpufreq/powernv-cpufreq.c
> > index 46bee8a..ef6ed8c 100644
> > --- a/drivers/cpufreq/powernv-cpufreq.c
> > +++ b/drivers/cpufreq/powernv-cpufreq.c
> > @@ -206,6 +206,43 @@ static inline void set_pmspr(unsigned long sprn, unsigned long val)
> > BUG();
> > }
> >
> > +/*
> > + * Computes the current frequency on this cpu
> > + * and stores the result in *ret_freq.
> > + */
> > +static void powernv_read_cpu_freq(void *ret_freq)
> > +{
> > + unsigned long pmspr_val;
> > + s8 local_pstate_id;
> > + int *cur_freq, freq, pstate_id;
> > +
> > + cur_freq = (int *)ret_freq;
>
> You don't need cur_freq variable at all..
I don't like it either. But the compiler complains without this hack
:-(
>
> > + pmspr_val = get_pmspr(SPRN_PMSR);
> > +
> > + /* The local pstate id corresponds bits 48..55 in the PMSR.
> > + * Note: Watch out for the sign! */
> > + local_pstate_id = (pmspr_val >> 48) & 0xFF;
> > + pstate_id = local_pstate_id;
>
> similarly local_pstate_id
well, I am interested in the bits 48..55 of pmspr_val. That's the
pstate_id which can be negative. So I'll like to keep
local_pstate_id.
>
> > +
> > + freq = pstate_id_to_freq(pstate_id);
> > + pr_debug("cpu %d pmsr %lx pstate_id %d frequency %d \n",
> > + smp_processor_id(), pmspr_val, pstate_id, freq);
> > + *cur_freq = freq;
>
> Move above print here after a blank line. Also remove freq variable as
> well and use *cur_freq directly.. And then you can rename it to freq
as well.
We can get rid of freq and use *cur_freq in its place.
Thanks for the detailed review.
--
Regards
gautham.
^ permalink raw reply
* [PATCH] mtd: m25p80: Modify the name of mtd_info
From: Hou Zhiqiang @ 2014-03-21 11:16 UTC (permalink / raw)
To: linux-mtd, linuxppc-dev; +Cc: scottwood, mingkai.hu, Hou Zhiqiang, dwmw2
To specify spi flash layouts by "mtdparts=..." in cmdline, we must
give mtd_info a fixed name,because the cmdlinepart's parser will
match the name of mtd_info given in cmdline.
Now, if use DT, the mtd_info's name will be spi->dev->name. It
consists of spi_master->bus_num, and the spi_master->bus_num maybe
dynamically fetched. So, in this case, replace the component bus_num
with thei physical address of spi master.
Signed-off-by: Hou Zhiqiang <B48286@freescale.com>
---
drivers/mtd/devices/m25p80.c | 18 +++++++++++++++---
1 file changed, 15 insertions(+), 3 deletions(-)
diff --git a/drivers/mtd/devices/m25p80.c b/drivers/mtd/devices/m25p80.c
index 7eda71d..64450a2 100644
--- a/drivers/mtd/devices/m25p80.c
+++ b/drivers/mtd/devices/m25p80.c
@@ -30,6 +30,7 @@
#include <linux/mtd/cfi.h>
#include <linux/mtd/mtd.h>
#include <linux/mtd/partitions.h>
+#include <linux/of_address.h>
#include <linux/of_platform.h>
#include <linux/spi/spi.h>
@@ -934,9 +935,11 @@ static int m25p_probe(struct spi_device *spi)
struct flash_platform_data *data;
struct m25p *flash;
struct flash_info *info;
- unsigned i;
+ unsigned i, ret;
struct mtd_part_parser_data ppdata;
struct device_node *np = spi->dev.of_node;
+ struct resource res;
+ struct device_node *mnp = spi->master->dev.of_node;
/* Platform data helps sort out which chip type we have, as
* well as how this board partitions it. If we don't have
@@ -1009,8 +1012,17 @@ static int m25p_probe(struct spi_device *spi)
if (data && data->name)
flash->mtd.name = data->name;
- else
- flash->mtd.name = dev_name(&spi->dev);
+ else{
+ ret = of_address_to_resource(mnp, 0, &res);
+ if (ret) {
+ dev_err(&spi->dev, "failed to get spi master resource\n");
+ return ret;
+ }
+ flash->mtd.name = kasprintf(GFP_KERNEL, "spi%x.%d",
+ (unsigned)res.start, spi->chip_select);
+ if (!flash->mtd.name)
+ return -ENOMEM;
+ }
flash->mtd.type = MTD_NORFLASH;
flash->mtd.writesize = 1;
--
1.8.5
^ permalink raw reply related
* Re: [PATCH v3 1/5] powernv: cpufreq driver for powernv platform
From: Srivatsa S. Bhat @ 2014-03-21 11:40 UTC (permalink / raw)
To: Viresh Kumar
Cc: linuxppc-dev, ego@linux.vnet.ibm.com, Anton Blanchard,
Linux PM list
In-Reply-To: <CAKohpo=JqHOPF_pdcAsvRgc1vENmS=Sg9pS8ZXPGhfMFnA8ZUA@mail.gmail.com>
On 03/21/2014 04:24 PM, Viresh Kumar wrote:
> On 21 March 2014 16:13, Gautham R Shenoy <ego@linux.vnet.ibm.com> wrote:
>> On Fri, Mar 21, 2014 at 02:11:32PM +0530, Viresh Kumar wrote:
>
>>>> + pr_debug("PState id %d freq %d MHz\n", id, freq);
>>>> + powernv_freqs[i].driver_data = i;
>>>
[...]
>>>> +static int powernv_cpufreq_cpu_init(struct cpufreq_policy *policy)
>>>> +{
>>>> + int base, i;
>>>> +
>>>> +#ifdef CONFIG_SMP
>>>
>>> What will break if you don't have this ifdef here? Without that as well
>>> below code should work?
>
> Missed this one?
>
Nothing will break, its just that the code size will be a tiny bit
lesser on UP configs, that's all :-) Anyway, I think removing the ifdef
improves the readability (and doesn't add any noticeable overhead on UP
kernels), so let's get rid of it.
Regards,
Srivatsa S. Bhat
>>>> + base = cpu_first_thread_sibling(policy->cpu);
>>>> +
>>>> + for (i = 0; i < threads_per_core; i++)
>>>> + cpumask_set_cpu(base + i, policy->cpus);
>>>> +#endif
>>>> + policy->cpuinfo.transition_latency = 25000;
>>>> +
>>>> + policy->cur = powernv_freqs[0].frequency;
>>>> + cpufreq_frequency_table_get_attr(powernv_freqs, policy->cpu);
>>>
^ permalink raw reply
* Re: [PATCH v3 1/5] powernv: cpufreq driver for powernv platform
From: Srivatsa S. Bhat @ 2014-03-21 11:45 UTC (permalink / raw)
To: Viresh Kumar
Cc: Gautham R. Shenoy, Linux PM list, linuxppc-dev, Anton Blanchard
In-Reply-To: <CAOh2x=kp65vrKamtxxR9iCX+t-S3nDJP05+1mfpOiWzbWpfGYA@mail.gmail.com>
On 03/21/2014 02:11 PM, Viresh Kumar wrote:
> On Thu, Mar 20, 2014 at 5:40 PM, Gautham R. Shenoy
> <ego@linux.vnet.ibm.com> wrote:
>> From: Vaidyanathan Srinivasan <svaidy@linux.vnet.ibm.com>
>
> Hi Vaidy,
>
>> diff --git a/drivers/cpufreq/Kconfig b/drivers/cpufreq/Kconfig
>> index 4b029c0..4ba1632 100644
>> --- a/drivers/cpufreq/Kconfig
>> +++ b/drivers/cpufreq/Kconfig
>> @@ -48,6 +48,7 @@ config CPU_FREQ_STAT_DETAILS
>> choice
[...]
>> +static struct cpufreq_driver powernv_cpufreq_driver = {
>> + .verify = powernv_cpufreq_verify,
>> + .target = powernv_cpufreq_target,
>
> I think you have Srivatsa there who has seen lots of cpufreq code and
> could have helped you a lot :)
>
:-)
I have followed the locking and synchronization aspects of cpufreq
closely, but unfortunately, I haven't been able to keep up with some of
the other details that well :-( Besides, its hard to keep up with the
rate of your changes, you are way too fast! ;-)
Regards,
Srivatsa S. Bhat
^ permalink raw reply
* Re: [PATCH v3 5/5] powernv:cpufreq: Implement the driver->get() method
From: Viresh Kumar @ 2014-03-21 11:45 UTC (permalink / raw)
To: ego@linux.vnet.ibm.com; +Cc: linuxppc-dev, Linux PM list
In-Reply-To: <20140321110445.GB2493@in.ibm.com>
On 21 March 2014 16:34, Gautham R Shenoy <ego@linux.vnet.ibm.com> wrote:
> Heh! Well, that wasn't the reason why this was sent out as a separate
> patch, but never mind. Though I don't understand why it would be
> difficult to review the patch though.
Because the initial driver wasn't complete earlier. There were 2-3 patches
after the first one which are changing what the first patch has added.
Nothing else :)
>> > +static void powernv_read_cpu_freq(void *ret_freq)
>> > +{
>> > + unsigned long pmspr_val;
>> > + s8 local_pstate_id;
>> > + int *cur_freq, freq, pstate_id;
>> > +
>> > + cur_freq = (int *)ret_freq;
>>
>> You don't need cur_freq variable at all..
>
> I don't like it either. But the compiler complains without this hack
> :-(
Why would the compiler warn for doing this?:
*(int *)ret_freq = freq;
>> > + pmspr_val = get_pmspr(SPRN_PMSR);
>> > +
>> > + /* The local pstate id corresponds bits 48..55 in the PMSR.
>> > + * Note: Watch out for the sign! */
>> > + local_pstate_id = (pmspr_val >> 48) & 0xFF;
>> > + pstate_id = local_pstate_id;
>>
>> similarly local_pstate_id
>
> well, I am interested in the bits 48..55 of pmspr_val. That's the
> pstate_id which can be negative. So I'll like to keep
> local_pstate_id.
Can you please explain at bit level how getting the value in a s8
first and then into a s32 will help you here? Instead of getting it
directly into s32.
^ permalink raw reply
* Re: [PATCH v3 1/5] powernv: cpufreq driver for powernv platform
From: Viresh Kumar @ 2014-03-21 11:47 UTC (permalink / raw)
To: Srivatsa S. Bhat
Cc: Gautham R. Shenoy, Linux PM list, linuxppc-dev, Anton Blanchard
In-Reply-To: <532C263F.4090504@linux.vnet.ibm.com>
On 21 March 2014 17:15, Srivatsa S. Bhat
<srivatsa.bhat@linux.vnet.ibm.com> wrote:
>> I think you have Srivatsa there who has seen lots of cpufreq code and
>> could have helped you a lot :)
>>
>
> :-)
I was waiting for your reply here :)
> I have followed the locking and synchronization aspects of cpufreq
> closely, but unfortunately, I haven't been able to keep up with some of
> the other details that well :-( Besides, its hard to keep up with the
> rate of your changes, you are way too fast! ;-)
Haha.. I am a very slow guy, really :)
^ permalink raw reply
* RE: [PATCH v3 5/5] powernv:cpufreq: Implement the driver->get() method
From: David Laight @ 2014-03-21 12:01 UTC (permalink / raw)
To: 'Viresh Kumar', ego@linux.vnet.ibm.com
Cc: linuxppc-dev@ozlabs.org, Linux PM list
In-Reply-To: <CAKohpo=k-e1GLiLRNtJ3Xi3+NUWW1+gvtCNr_4Ag60j49dZvdQ@mail.gmail.com>
RnJvbTogVmlyZXNoIEt1bWFyDQogDQo+IE9uIDIxIE1hcmNoIDIwMTQgMTY6MzQsIEdhdXRoYW0g
UiBTaGVub3kgPGVnb0BsaW51eC52bmV0LmlibS5jb20+IHdyb3RlOg0KPiA+IEhlaCEgV2VsbCwg
dGhhdCB3YXNuJ3QgdGhlIHJlYXNvbiB3aHkgdGhpcyB3YXMgc2VudCBvdXQgYXMgYSBzZXBhcmF0
ZQ0KPiA+IHBhdGNoLCBidXQgbmV2ZXIgbWluZC4gVGhvdWdoIEkgZG9uJ3QgdW5kZXJzdGFuZCB3
aHkgaXQgd291bGQgYmUNCj4gPiBkaWZmaWN1bHQgdG8gcmV2aWV3IHRoZSBwYXRjaCB0aG91Z2gu
DQo+IA0KPiBCZWNhdXNlIHRoZSBpbml0aWFsIGRyaXZlciB3YXNuJ3QgY29tcGxldGUgZWFybGll
ci4gVGhlcmUgd2VyZSAyLTMgcGF0Y2hlcw0KPiBhZnRlciB0aGUgZmlyc3Qgb25lIHdoaWNoIGFy
ZSBjaGFuZ2luZyB3aGF0IHRoZSBmaXJzdCBwYXRjaCBoYXMgYWRkZWQuDQo+IE5vdGhpbmcgZWxz
ZSA6KQ0KPiANCj4gPj4gPiArc3RhdGljIHZvaWQgcG93ZXJudl9yZWFkX2NwdV9mcmVxKHZvaWQg
KnJldF9mcmVxKQ0KPiA+PiA+ICt7DQo+ID4+ID4gKyAgICAgICB1bnNpZ25lZCBsb25nIHBtc3By
X3ZhbDsNCj4gPj4gPiArICAgICAgIHM4IGxvY2FsX3BzdGF0ZV9pZDsNCj4gPj4gPiArICAgICAg
IGludCAqY3VyX2ZyZXEsIGZyZXEsIHBzdGF0ZV9pZDsNCj4gPj4gPiArDQo+ID4+ID4gKyAgICAg
ICBjdXJfZnJlcSA9IChpbnQgKilyZXRfZnJlcTsNCj4gPj4NCj4gPj4gWW91IGRvbid0IG5lZWQg
Y3VyX2ZyZXEgdmFyaWFibGUgYXQgYWxsLi4NCj4gPg0KPiA+IEkgZG9uJ3QgbGlrZSBpdCBlaXRo
ZXIuIEJ1dCB0aGUgY29tcGlsZXIgY29tcGxhaW5zIHdpdGhvdXQgdGhpcyBoYWNrDQo+ID4gOi0o
DQo+IA0KPiBXaHkgd291bGQgdGhlIGNvbXBpbGVyIHdhcm4gZm9yIGRvaW5nIHRoaXM/Og0KPiAN
Cj4gKihpbnQgKilyZXRfZnJlcSA9IGZyZXE7DQoNCkJlY2F1c2UgaXQgaXMgdmVyeSBsaWtlbHkg
dG8gYmUgd3JvbmcuDQpJbiBnZW5lcmFsIGNhc3RzIG9mIHBvaW50ZXJzIHRvIGludGVnZXIgdHlw
ZXMgYXJlIGRhbmdlcm91cy4NCkluIHRoaXMgY2FzZSB3aHkgbm90IG1ha2UgdGhlIGZ1bmN0aW9u
IHJldHVybiB0aGUgdmFsdWU/DQoNCglEYXZpZA0KDQoNCg==
^ permalink raw reply
* Re: [PATCH RFC/RFT v3 6/9] powerpc: move cacheinfo sysfs to generic cacheinfo infrastructure
From: Sudeep Holla @ 2014-03-21 12:04 UTC (permalink / raw)
To: Anshuman Khandual
Cc: linuxppc-dev@lists.ozlabs.org, Paul Mackerras,
linux-kernel@vger.kernel.org, Sudeep Holla
In-Reply-To: <532BB5AC.3000904@linux.vnet.ibm.com>
Hi Anshuman,
On 21/03/14 03:44, Anshuman Khandual wrote:
> On 03/10/2014 04:42 PM, Sudeep Holla wrote:
>> Hi Anshuman,
>>
>> On 07/03/14 06:14, Anshuman Khandual wrote:
>>> On 03/07/2014 09:36 AM, Anshuman Khandual wrote:
>>>> On 02/19/2014 09:36 PM, Sudeep Holla wrote:
>>>>> From: Sudeep Holla <sudeep.holla@arm.com>
>>>>>
>>>>> This patch removes the redundant sysfs cacheinfo code by making use o=
f
>>>>> the newly introduced generic cacheinfo infrastructure.
[...]
>>>> When it is UNIFIED we return index 0, which is correct. But the index
>>>> for instruction and data cache seems to be swapped which wrong. This
>>>> will fetch invalid properties for any given cache type.
>>>>
>>
>> Ah, that's silly mistake on my side, will fix it.
>>
>>>> I have done some initial review and testing for this patch's impact on
>>>> PowerPC (ppc64 POWER specifically). I am trying to do some code clean-=
up
>>>> and re-arrangements. Will post out soon. Thanks !
>>
>> Thanks for taking time for testing and reviewing these patches.
>=20
> Now that you got some of the problems to work on and resend the patches, =
I will
> hold on to the clean up patches I had.
>=20
I have done most of the changes but still unable to find why the shared_cpu=
_map
is getting incorrect on PPC. All the other wrong entries are fixed. Any clu=
e on
shared_cpu_map ?
Regards,
Sudeep
^ permalink raw reply
* Re: [PATCH v3 5/5] powernv:cpufreq: Implement the driver->get() method
From: Gautham R Shenoy @ 2014-03-21 12:31 UTC (permalink / raw)
To: David Laight
Cc: linuxppc-dev@ozlabs.org, 'Viresh Kumar', Linux PM list,
ego@linux.vnet.ibm.com
In-Reply-To: <063D6719AE5E284EB5DD2968C1650D6D0F6E5386@AcuExch.aculab.com>
On Fri, Mar 21, 2014 at 12:01:07PM +0000, David Laight wrote:
> From: Viresh Kumar
>
> > On 21 March 2014 16:34, Gautham R Shenoy <ego@linux.vnet.ibm.com> wrote:
> > > Heh! Well, that wasn't the reason why this was sent out as a separate
> > > patch, but never mind. Though I don't understand why it would be
> > > difficult to review the patch though.
> >
> > Because the initial driver wasn't complete earlier. There were 2-3 patches
> > after the first one which are changing what the first patch has added.
> > Nothing else :)
> >
> > >> > +static void powernv_read_cpu_freq(void *ret_freq)
> > >> > +{
> > >> > + unsigned long pmspr_val;
> > >> > + s8 local_pstate_id;
> > >> > + int *cur_freq, freq, pstate_id;
> > >> > +
> > >> > + cur_freq = (int *)ret_freq;
> > >>
> > >> You don't need cur_freq variable at all..
> > >
> > > I don't like it either. But the compiler complains without this hack
> > > :-(
> >
> > Why would the compiler warn for doing this?:
> >
> > *(int *)ret_freq = freq;
>
> Because it is very likely to be wrong.
> In general casts of pointers to integer types are dangerous.
> In this case why not make the function return the value?
Because this function is called via an smp_call_function(). And we
need a way of returning the value to the caller.
>
> David
>
>
^ permalink raw reply
* Re: [PATCH v3 5/5] powernv:cpufreq: Implement the driver->get() method
From: Viresh Kumar @ 2014-03-21 12:34 UTC (permalink / raw)
To: David Laight
Cc: ego@linux.vnet.ibm.com, Linux PM list, linuxppc-dev@ozlabs.org
In-Reply-To: <063D6719AE5E284EB5DD2968C1650D6D0F6E5386@AcuExch.aculab.com>
On 21 March 2014 17:31, David Laight <David.Laight@aculab.com> wrote:
>> *(int *)ret_freq = freq;
>
> Because it is very likely to be wrong.
> In general casts of pointers to integer types are dangerous.
Where are we converting pointers to integers? We are doing a
cast from 'void * ' to 'int *' and then using indirection operator
to set its value.
^ permalink raw reply
* Re: [PATCH v3 5/5] powernv:cpufreq: Implement the driver->get() method
From: Gautham R Shenoy @ 2014-03-21 13:04 UTC (permalink / raw)
To: Viresh Kumar; +Cc: ego@linux.vnet.ibm.com, Linux PM list, linuxppc-dev
In-Reply-To: <CAKohpo=k-e1GLiLRNtJ3Xi3+NUWW1+gvtCNr_4Ag60j49dZvdQ@mail.gmail.com>
On Fri, Mar 21, 2014 at 05:15:34PM +0530, Viresh Kumar wrote:
> On 21 March 2014 16:34, Gautham R Shenoy <ego@linux.vnet.ibm.com> wrote:
> > Heh! Well, that wasn't the reason why this was sent out as a separate
> > patch, but never mind. Though I don't understand why it would be
> > difficult to review the patch though.
>
> Because the initial driver wasn't complete earlier. There were 2-3 patches
> after the first one which are changing what the first patch has added.
> Nothing else :)
>
> >> > +static void powernv_read_cpu_freq(void *ret_freq)
> >> > +{
> >> > + unsigned long pmspr_val;
> >> > + s8 local_pstate_id;
> >> > + int *cur_freq, freq, pstate_id;
> >> > +
> >> > + cur_freq = (int *)ret_freq;
> >>
> >> You don't need cur_freq variable at all..
> >
> > I don't like it either. But the compiler complains without this hack
> > :-(
>
> Why would the compiler warn for doing this?:
>
> *(int *)ret_freq = freq;
The compiler doesn't complain if I do this.
>
> >> > + pmspr_val = get_pmspr(SPRN_PMSR);
> >> > +
> >> > + /* The local pstate id corresponds bits 48..55 in the PMSR.
> >> > + * Note: Watch out for the sign! */
> >> > + local_pstate_id = (pmspr_val >> 48) & 0xFF;
> >> > + pstate_id = local_pstate_id;
> >>
> >> similarly local_pstate_id
> >
> > well, I am interested in the bits 48..55 of pmspr_val. That's the
> > pstate_id which can be negative. So I'll like to keep
> > local_pstate_id.
>
> Can you please explain at bit level how getting the value in a s8
> first and then into a s32 will help you here? Instead of getting it
> directly into s32.
Consider the case when pmspr = 0x00feffffffffffff;
We are interested in extracting the value 'fe'. And ensure that when
we store this value into an int, we get the sign extension right.
So the following doesn't work:
pstate_id = (pmspr_val >> 48) & 0xFFFFFFFF;
Since we get pstate_id = 0x000000fe, which is not the same as
0xfffffffe.
Of course, we could do the following, but I wasn't sure if
two levels of type casting helped on the readability front.
pstate_id = (int) ((s8)((pmspr_val >> 48) & 0xFF));
--
Thanks and Regards
gautham.
>
^ permalink raw reply
* Re: [PATCH v3 5/5] powernv:cpufreq: Implement the driver->get() method
From: Viresh Kumar @ 2014-03-21 13:12 UTC (permalink / raw)
To: ego@linux.vnet.ibm.com; +Cc: linuxppc-dev@ozlabs.org, Linux PM list
In-Reply-To: <20140321130450.GD2493@in.ibm.com>
On 21 March 2014 18:34, Gautham R Shenoy <ego@linux.vnet.ibm.com> wrote:
> Consider the case when pmspr = 0x00feffffffffffff;
>
> We are interested in extracting the value 'fe'. And ensure that when
> we store this value into an int, we get the sign extension right.
>
> So the following doesn't work:
>
> pstate_id = (pmspr_val >> 48) & 0xFFFFFFFF;
What about pstate_id = (pmspr_val >> 48) & 0xFF; ??
^ permalink raw reply
* Re: [PATCH v3 1/5] powernv: cpufreq driver for powernv platform
From: Gautham R Shenoy @ 2014-03-21 13:23 UTC (permalink / raw)
To: Viresh Kumar
Cc: ego@linux.vnet.ibm.com, Linux PM list, linuxppc-dev,
Anton Blanchard, Srivatsa S. Bhat
In-Reply-To: <CAKohpo=JqHOPF_pdcAsvRgc1vENmS=Sg9pS8ZXPGhfMFnA8ZUA@mail.gmail.com>
Hi Viresh,
On Fri, Mar 21, 2014 at 04:24:27PM +0530, Viresh Kumar wrote:
> On 21 March 2014 16:13, Gautham R Shenoy <ego@linux.vnet.ibm.com> wrote:
> > On Fri, Mar 21, 2014 at 02:11:32PM +0530, Viresh Kumar wrote:
>
> >> > + pr_debug("PState id %d freq %d MHz\n", id, freq);
> >> > + powernv_freqs[i].driver_data = i;
> >>
> >> I don't think you are using this field at all and this is the field you can
> >> use for driver_data and so you can get rid of powernv_pstate_ids[ ].
> >
> > Using driver_data to record powernv_pstate_ids won't work since
> > powernv_pstate_ids can be negative. So a pstate_id -3 can be confused
> > with CPUFREQ_BOOST_FREQ thereby not displaying the frequency
> > corresponding to pstate id -3. So for now I think we will be retaining
> > powernv_pstate_ids.
>
> As I said earlier, this field is only used by cpufreq drivers and cpufreq core
> isn't supposed to touch it. CPUFREQ_BOOST_FREQ and other macros
> are there for .frequency field and not this one.
>
Ok, I had based my code on linus's git tree. I checked the 'pm-cpufreq'
branch of Rafael's 'linux-pm' tree and freq_table.c contains the
following code snippet in show_available_frequencies:
if (show_boost ^ (table[i].driver_data == CPUFREQ_BOOST_FREQ))
continue;
I suspect we're talking about different code bases. So could you
please tell me which one should I be looking at ?
>
> >> > +static int powernv_cpufreq_cpu_init(struct cpufreq_policy *policy)
> >> > +{
> >> > + int base, i;
> >> > +
> >> > +#ifdef CONFIG_SMP
> >>
> >> What will break if you don't have this ifdef here? Without that as well
> >> below code should work?
>
> Missed this one?
>
> >> > + base = cpu_first_thread_sibling(policy->cpu);
> >> > +
> >> > + for (i = 0; i < threads_per_core; i++)
> >> > + cpumask_set_cpu(base + i, policy->cpus);
> >> > +#endif
> >> > + policy->cpuinfo.transition_latency = 25000;
> >> > +
> >> > + policy->cur = powernv_freqs[0].frequency;
> >> > + cpufreq_frequency_table_get_attr(powernv_freqs, policy->cpu);
> >>
> >> This doesn't exist anymore.
> >
> > Didn't get this comment!
>
> cpufreq_frequency_table_get_attr() routine doesn't exist anymore.
>
> >> > +static int powernv_cpufreq_cpu_exit(struct cpufreq_policy *policy)
> >> > +{
> >> > + cpufreq_frequency_table_put_attr(policy->cpu);
> >> > + return 0;
> >> > +}
> >>
> >> You don't need this..
> >
> > Why not ?
>
> Because cpufreq_frequency_table_get_attr() and
> cpufreq_frequency_table_put_attr() don't exist anymore :)
Well, it does in the codebases that I was looking at. May be I've been
looking at the wrong place.
>
> >> > +module_init(powernv_cpufreq_init);
> >> > +module_exit(powernv_cpufreq_exit);
> >>
> >> Place these right after the routines without any blank lines in
> > between.
> >
> > Is this the new convention ?
>
> Don't know I have been following this since long time, probably from the
> time I started with Mainline stuff.. I have seen many maintainers advising this
> as it make code more readable, specially if these routines are quite big..
>
> Probably it isn't mentioned in coding guidelines but people follow it most of
> the times.
Ok. I was not aware of this. Good to know :-)
>
--
Thanks and Regards
gautham.
^ permalink raw reply
page: next (older) | prev (newer) | latest
- recent:[subjects (threaded)|topics (new)|topics (active)]
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox